线程和进程的不同信号处理程序?是不是可以

Posted

技术标签:

【中文标题】线程和进程的不同信号处理程序?是不是可以【英文标题】:different signal handler for thread and process?. Is it possible线程和进程的不同信号处理程序?是否可以 【发布时间】:2011-09-04 01:42:09 【问题描述】:

有几个关于信令的问题。

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

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

【问题讨论】:

【参考方案1】:

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

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

终端产生的信号(SIGINTSIGTSTPSIGQUIT)传递到整个流程。

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

【讨论】:

U 提到“只要有至少一个线程没有阻塞该信号,就会立即传递该信号”.. -> 这是否表明每个线程可以阻塞不同的信号?或阻塞的信号一个线程反映在另一个线程中? 每个线程都有自己的一组阻塞信号,可由pthread_sigmask控制。 @R.. 谢谢!我应该参考哪个手册页/文档以获取更多信息?

以上是关于线程和进程的不同信号处理程序?是不是可以的主要内容,如果未能解决你的问题,请参考以下文章

进程线程锁

20190102(多线程,守护线程,线程互斥锁,信号量,JoinableQueue)

c# 一个程序关闭,如果有前台线程还在运行,当前台线程运行完是不是会关闭?还是一直存在?

单核和多核,单进程和多进程,单线程与多线程

java 多线程是啥?一个处理器怎么同时处理多个程序

Java基础学习——多线程