有一个守护进程有两个线程:th1,th2。 th2使用read(2)
读取套接字。
如果我用SIGTERM
杀死守护进程,th1捕获并处理信号(设置终止标志),之后调用守护进程析构函数,它调用pthread_kill(th2, SIGTERM)
。但是,第二个线程没有收到SIGTERM
,所以它不会被杀死(当套接字接收数据并从read()
退出时,它会完成执行,因为终止标志已经设置)。 / p>
如果我拨打pthread_kill(th2, SIGUSR2)
,然后pthread_kill(th2, SIGTERM)
,则所有内容都会正确完成。因此,UNIX似乎不允许发送相同的信号。
此行为是否依赖于操作系统?我们可以确保指定的线程从另一个线程接收SIGTERM
吗?
答案 0 :(得分:5)
Unix允许向进程发送多个连续信号,但是如果信号发送得太近,或者在已经挂起的信号被传递之前已经向进程发送了附加信号,则可以将多个信号连接成一个单信号事件。
还要记住,虽然pthread_kill()
向给定的线程发送信号以进行处理,但信号的实际处理具有全局效应(即,信号处理程序是每个进程,而不是每个线程)
您可能还希望明确调用pthread_cancel()
,因为read()
是有效的取消点。如果需要,您可以添加取消处理程序,并在使用非取消安全的函数时阻止线程的取消状态。您可以阅读有关使用pthread_cancel()
here。
答案 1 :(得分:1)
相对老派但有效的方法是使用select()和管道将信号重新分配给所有线程。 (您在阻塞句柄上选择()管道读取句柄。(
)