R..*_*R.. 15
信号可以发送到进程或特定线程.对于发送到进程的信号,一旦至少有一个线程没有阻塞该信号,就会传递信号,如果有多个这样的线程,它可能被传递给它们中的任何一个(不可预测的一).对于发送到特定线程的信号,只要该线程没有阻塞信号,就会传递它们.
使用raise函数引发信号将信号发送到调用的线程raise,而不是整个过程.由于线程所做的事情(例如SIGSEGV SIGFPE,和SIGPIPE)自动生成的信号也被传递到该特定线程.
从终端产生的信号(SIGINT,SIGTSTP,SIGQUIT)被递送到的全过程.
没有办法为每个线程安装单独的信号处理程序,但信号的信号处理程序可能能够检查它正在运行的线程.如果你知道信号没有中断async-signal-unsafe函数,你可以调用pthread_self获取当前线程ID.否则,一个丑陋但安全的方法是获取地址errno并根据它查找您所在的线程(您必须自己保留映射表并确保对此表的访问是异步信号安全的) .