线程和进程的不同信号处理程序?是不是可以
Posted
技术标签:
【中文标题】线程和进程的不同信号处理程序?是不是可以【英文标题】:different signal handler for thread and process?. Is it possible线程和进程的不同信号处理程序?是否可以 【发布时间】:2011-09-04 01:42:09 【问题描述】:有几个关于信令的问题。
1) 当进程与主线程一起有更多线程时,如果信号被引发,哪个线程将停止其处理并继续信号处理程序?它是主线程还是主线程以外的?
2) 是否可以在主线程和特定线程之间为同一信号保留不同的处理程序?
【问题讨论】:
【参考方案1】:信号可以发送到进程或特定线程。对于发送到进程的信号,只要至少有一个线程没有阻塞该信号,信号就会被传递,如果有多个这样的线程,它可能会传递给它们中的任何一个(无法预测哪个一)。对于发送到特定线程的信号,一旦该线程没有阻塞信号,它们就会被传递。
使用raise
函数引发信号将信号发送到调用raise
的线程,而不是整个进程。由于线程所做的事情(如SIGSEGV
SIGFPE
和SIGPIPE
)而自动生成的信号也会传递给该特定线程。
终端产生的信号(SIGINT
、SIGTSTP
、SIGQUIT
)传递到整个流程。
没有办法为每个线程安装单独的信号处理程序,但信号的信号处理程序可能能够检查它在哪个线程中运行。如果您知道信号没有中断async-signal-unsafe 函数,你可以调用pthread_self
来获取当前线程ID。否则,一种丑陋但安全的方法是获取errno
的地址并根据该地址查找您所在的线程(您必须自己保留一个映射表并确保对该表的访问是异步信号-安全)。
【讨论】:
U 提到“只要有至少一个线程没有阻塞该信号,就会立即传递该信号”.. -> 这是否表明每个线程可以阻塞不同的信号?或阻塞的信号一个线程反映在另一个线程中? 每个线程都有自己的一组阻塞信号,可由pthread_sigmask
控制。
@R.. 谢谢!我应该参考哪个手册页/文档以获取更多信息?以上是关于线程和进程的不同信号处理程序?是不是可以的主要内容,如果未能解决你的问题,请参考以下文章
20190102(多线程,守护线程,线程互斥锁,信号量,JoinableQueue)