【问题标题】: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,并让进程退出核心转储,以便稍后在调试器中进行分析。