需要保证信号将被违规线程消除

时间:2011-02-25 19:48:11

标签: pthreads clone signals

我正在开发一个项目,但在以下情况下找不到任何验证信号/线程行为的文档。

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

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

2 个答案:

答案 0 :(得分:3)

POSIX chapter on Signal Generation and Delivery表示:

  

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

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

答案 1 :(得分:0)

我很确定这是有效的,即使它没有保证。我的观察基于这样一个事实:我曾经在一家公司工作,我们经常在多线程程序中处理SIGSEGV并将堆栈跟踪打印到日志文件(基于当前位置)。我们在各种平台上做到了 - windows,linux,tru64 unix,aix,hpux,sunos ......还有一两个我无法回想起的。这(通常!)有效,因为SIGSEGV的位置仍然在当前堆栈上(信号处理机制只是在它上面添加了几个调用帧)。

公平地说,在信号处理程序中你应该做的很少,因为没有很多异步信号安全的函数。我们忽略了这一点并且大部分时间都没有了,除非我记得我们会被烧毁的sunos(或aix) - 这个过程偶尔会(并且看似随机地)在信号处理程序内部退出。

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