处理两个随后的SIGTERM

vis*_*ssi 3 c c++ unix signals sigterm

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

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

如果我打电话pthread_kill(th2, SIGUSR2),然后pthread_kill(th2, SIGTERM),一切都正确完成.因此,UNIX似乎不允许发送相同的信号.

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

Jas*_*son 5

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

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

您可能还希望查看显式调用,pthread_cancel()因为它read()是一个有效的取消点.如果需要,您可以添加取消处理程序,并在使用非取消安全的函数时阻止线程的取消状态.您可以在pthread_cancel() 此处阅读有关使用的一些提示.