线程和进程的不同信号处理程序?可能吗

时间:2011-09-04 01:42:10

标签: c linux process pthreads

关于信号的问题很少。

1)当进程与主线程一起有更多线程时,如果信号被提出,哪个线程将停止其处理并继续使用信号处理程序?它是主线程还是主线程以外的?

2)是否可以为主线程和特定线程之间的相同信号保留不同的处理程序?

1 个答案:

答案 0 :(得分:15)

可以将信号发送到进程或特定线程。对于发送到进程的信号,一旦至少有一个线程没有阻塞该信号,就会传递信号,如果有多个这样的线程,它可能被传递给它们中的任何一个(不可预测的一)。对于发送到特定线程的信号,只要该线程没有信号被阻塞,它们就会被传送。

使用raise函数发出信号会将信号发送到调用raise的线程,而不是整个过程。由于线程所做的事情而自动生成的信号(如SIGSEGV SIGFPESIGPIPE)也会传递给该特定线程。

终端(SIGINTSIGTSTPSIGQUIT)生成的信号会传递给整个过程。

无法为每个线程安装单独的信号处理程序,但信号的信号处理程序可以能够检查它正在运行的线程。如果您知道信号没有中断async-signal-unsafe函数,您可以调用pthread_self来获取当前的线程ID。否则,一个丑陋但安全的方法是获取errno的地址并根据它查找您所在的线程(您必须自己保留映射表并确保对此表的访问是异步的-signal安全的)。