【问题标题】:Need guarantee that signals will be deilivered by offending thread需要保证信号将由违规线程传递
【发布时间】:2011-02-25 19:48:10
【问题描述】:

我正在处理一个项目,但找不到任何文档来验证以下案例的信号/线程行为。

我需要确保线程中生成的信号将由有问题的线程(即SIGSEGV)传递。我被告知POSIX 不能确保这种行为,例如pthreads 可以在pthread 1 中生成信号,但在pthread 2 中传递信号。因此,我计划使用clone(2) 来更好地控制信号/线程行为,但仍然无法在手册页中找到确保信号将由违规线程传递的文档。

铁杆系统程序员:非常感谢任何文档或见解!

【问题讨论】:

    标签: pthreads clone signals


    【解决方案1】:

    POSIX chapter on Signal Generation and Delivery 声明:

    在生成的时候,一个 应确定是否 该信号已为 进程或特定线程 过程中。信号是 由某些可归因的动作产生 到特定线程,例如 硬件故障,应生成 导致信号的线程 被生成。信号是 与一个相关联的生成 进程 ID 或进程组 ID 或 异步事件,例如终端 活动,应为 过程。

    由线程中不正确的内存访问引起的同步SIGSEGV显然是这样的信号“......由特定线程的某些操作产生......”,所以它们是保证为有问题的线程生成(这意味着由该线程处理或忽略,视情况而定)。

    【讨论】:

      【解决方案2】:

      我很确定这可行,即使不能保证。我基于以下事实进行观察:我曾经在一家公司工作,我们经常在多线程程序中处理 SIGSEGV 并将堆栈跟踪打印到日志文件(基于当前位置)。我们在各种平台上完成了这项工作——windows、linux、tru64 unix、aix、hpux、sunos ......也许还有一两个我不记得的其他平台。这(通常!)有效,因为 SIGSEGV 的位置仍在当前堆栈上(信号处理机制只是在其顶部添加了一些调用帧)。

      公平地说,在信号处理程序中您应该做的事情很少,因为异步信号安全的函数并不多。我们忽略了这一点,并且大部分都侥幸逃脱,除非我记得在 sunos(或 aix)上我们会被烧毁的地方——该过程偶尔会(并且看似随机)硬退出信号处理程序。

      我认为推荐的方法是不处理 SIGSEGV,并让进程退出核心转储,以便稍后在调试器中进行分析。

      【讨论】: