【发布时间】:2011-09-04 01:42:09
【问题描述】:
有几个关于信令的问题。
1) 当进程与主线程一起有更多线程时,如果信号被引发,哪个线程将停止其处理并继续信号处理程序?它是主线程还是主线程以外的?
2) 是否可以在主线程和特定线程之间为同一信号保留不同的处理程序?
【问题讨论】:
有几个关于信令的问题。
1) 当进程与主线程一起有更多线程时,如果信号被引发,哪个线程将停止其处理并继续信号处理程序?它是主线程还是主线程以外的?
2) 是否可以在主线程和特定线程之间为同一信号保留不同的处理程序?
【问题讨论】:
信号可以发送到进程或特定线程。对于发送到进程的信号,只要至少有一个线程没有阻塞该信号,信号就会被传递,如果有多个这样的线程,它可能会传递给它们中的任何一个(无法预测哪个一)。对于发送到特定线程的信号,一旦该线程没有阻塞信号,它们就会被传递。
使用raise 函数引发信号将信号发送到调用raise 的线程,而不是整个进程。由于线程所做的事情(如SIGSEGVSIGFPE 和SIGPIPE)而自动生成的信号也会传递给该特定线程。
终端产生的信号(SIGINT、SIGTSTP、SIGQUIT)传递到整个流程。
没有办法为每个线程安装单独的信号处理程序,但信号的信号处理程序可能能够检查它在哪个线程中运行。如果您知道信号没有中断async-signal-unsafe 函数,你可以调用pthread_self 来获取当前线程ID。否则,一种丑陋但安全的方法是获取errno 的地址并根据该地址查找您所在的线程(您必须自己保留一个映射表并确保对该表的访问是异步信号-安全)。
【讨论】:
pthread_sigmask控制。