【问题标题】:Signal Dispositions in PthreadsPthread 中的信号处理
【发布时间】:2010-10-21 17:51:12
【问题描述】:

pthreadsman 页面提到:

 POSIX.1 also requires that threads share a range  of  other  attributes
       (i.e., these attributes are process-wide rather than per-thread):

       ...

       -  signal dispositions

       ...

“信号配置”是什么意思?

【问题讨论】:

    标签: c pthreads signals


    【解决方案1】:

    I 信号处置是在传递信号时进程所采取的行动。每个信号都有一个处置。有默认值。

    来自signal(7)

    信号处置 每个信号都有一个当前的处置,它决定了进程如何 在传递信号时表现。 [处置是:] Term 默认操作是终止进程。 Ign 默认动作是忽略信号。 核心默认操作是终止进程并转储核心(请参阅核心(5))。 停止 默认操作是停止进程。 Cont 默认操作是在当前停止的情况下继续该过程。 [...] 信号处置是每个进程的属性:在多线程中 应用程序中,特定信号的处置对所有人都是相同的 线程。

    【讨论】:

      【解决方案2】:

      信号的处置方式就是它的处理方式。

      • 可能会被忽略
      • 可能会使用默认响应(取决于信号)进行处理
        • 停止
        • 退出
        • 退出核心转储
        • 忽略
      • 它可能由用户定义的信号处理程序处理

      在调用信号处理程序时也可能出现信号被屏蔽的问题,等等。

      【讨论】:

      • 那么,我只需要在主线程中指定一个信号处理程序,所有pthreads都会在发出信号时使用它?
      • @Kedar:或多或少...我没有玩过线程和信号处理,但我的理解是子线程继承其父线程的信号处置;然后,一个线程可以在不影响其他线程的情况下更改其自己的处置(当然,它在更改处置后创建的任何子级都会继承其当时的处置)。但是,您最好使用POSIX 标准对此进行检查,查找 pthread_create()、sigaction() 和一些一般信息。
      • @Jonathan:这是不正确的。信号处置是过程全局的。它不是线程之间的继承属性;这是一个共享状态。
      • @R..:我把你推荐给pthread_sigmask()
      • @Jonathan:信号处理与信号掩码是分开的。处置是全局的。屏蔽是线程局部的。
      【解决方案3】:

      这意味着 Unix 进程如何对信号作出反应。见signal(7)

      【讨论】:

        猜你喜欢
        • 2011-07-14
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        相关资源
        最近更新 更多