处理两个随后的SIGTERM

时间:2011-08-03 15:04:47

标签: c++ c unix signals sigterm

有一个守护进程有两个线程:th1,th2。 th2使用read(2)读取套接字。

如果我用SIGTERM杀死守护进程,th1捕获并处理信号(设置终止标志),之后调用守护进程析构函数,它调用pthread_kill(th2, SIGTERM)。但是,第二个线程没有收到SIGTERM,所以它不会被杀死(当套接字接收数据并从read()退出时,它会完成执行,因为终止标志已经设置)。 / p>

如果我拨打pthread_kill(th2, SIGUSR2),然后pthread_kill(th2, SIGTERM),则所有内容都会正确完成。因此,UNIX似乎不允许发送相同的信号。

此行为是否依赖于操作系统?我们可以确保指定的线程从另一个线程接收SIGTERM吗?

2 个答案:

答案 0 :(得分:5)

Unix允许向进程发送多个连续信号,但是如果信号发送得太近,或者在已经挂起的信号被传递之前已经向进程发送了附加信号,则可以将多个信号连接成一个单信号事件。

还要记住,虽然pthread_kill()向给定的线程发送信号以进行处理,但信号的实际处理具有全局效应(即,信号处理程序是每个进程,而不是每个线程)

您可能还希望明确调用pthread_cancel(),因为read()是有效的取消点。如果需要,您可以添加取消处理程序,并在使用非取消安全的函数时阻止线程的取消状态。您可以阅读有关使用pthread_cancel() here

的一些提示

答案 1 :(得分:1)

相对老派但有效的方法是使用select()和管道将信号重新分配给所有线程。 (您在阻塞句柄上选择()管道读取句柄。(