我正在开发一个项目,但在以下情况下找不到任何验证信号/线程行为的文档。
我需要确保线程中生成的信号将由违规线程(即SIGSEGV
)传递。我已被告知 POSIX无法确保此行为,例如,pthreads
可以在pthread 1
中生成信号,但在pthread 2
中传递信号}。因此,我打算使用clone(2)
来更好地控制信号/线程行为,但仍然无法在手册页中找到确保信号将由违规线程传递的文档。
Hardcore系统程序员:非常感谢任何文档或见解!
答案 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,让流程退出核心转储,以便稍后在调试器中进行分析。