2013-10-11 85 views
0

我正在发送内核空间模块的信号给一个进程。这个过程有一个线程等待信号。如何在线程中等待信号?

我阅读信号手册,它说: 信号处置是一个per-process属性:在多线程应用程序中,包括处理信号对于所有线程都是相同的。

因此,并且根据手册pthread_sigmask: http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html

我试图阻止在应用程序的主要功能的信号通过调用:

siginfo_t infoh1; 
sigset_t waith1; 

sigemptyset(&waith1); 
sigaddset(&waith1, SIG_HILO1); 
pthread_sigmask(SIG_BLOCK, &waith1, NULL); 

注意,线程正在等待因为它的执行功能。

result = sigwaitinfo (&waith1, &infoh1); 

信号被发送,但线程从未收到它(它挂起等待)。

我在做什么错?我用不同网站的不同代码进行了测试,结果没有成功

回答

2

我在* nix代码中使用了很多信号,我不认为这是一个好方法。

我建议所有线程都设置为忽略信号。主线程在线程处于互斥/条件时处理信号。在信号上,主进程用信号类型设置全局静态标志,然后通知线程正确检查标志以查看哪个信号被捕获。

这是一个安全和简单的解决方案。

+0

非常感谢你,我试着没有成功向一个线程发送一个信号,并且我编写了一个类似于你所描述的代码。从主进程(信号处理程序到达)开始,它将pthread_kill发送到线程以通知某个信号已到达。 – eduardosufan

+1

非常好,做得很好。请将我的回答设置为社区的答案。谢谢。 – Oakdale