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

有几个关于信令的问题。

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

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

【问题讨论】:

    标签: c linux process pthreads


    【解决方案1】:

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

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

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

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

    【讨论】:

    • U 提到“只要有至少一个线程没有阻塞该信号,就会立即传递该信号”.. -> 这是否表明每个线程可以阻塞不同的信号?或阻塞的信号一个线程反映在另一个线程中?
    • 每个线程都有自己的一组阻塞信号,可由pthread_sigmask控制。
    • @R.. 谢谢!我应该参考哪个手册页/文档以获取更多信息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2011-11-18
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多