如何在线程中等待信号?

时间:2013-10-11 19:56:47

标签: c linux multithreading kernel signals

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

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

因此,根据手册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);

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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