是SIGSEGV交付给每个线程?

时间:2011-06-30 10:27:21

标签: c linux memory-management signals

我在Linux中有一个多线程的程序。有一些记忆区域,我有兴趣看看它们是否在一定时间内写完。为此,我只给予那些内存页面的读访问权限,并为SIGSEGV安装信号处理程序。现在我的问题是,每个线程是否会为自己调用信号处理程序。假设线程1写入某个禁止的内存区域,它是执行信号处理程序的那个吗?

2 个答案:

答案 0 :(得分:22)

首先

  

信号处理是整个过程;   进程中的所有线程共享   每个信号的相同配置。如果   一个线程使用sigaction()来   为SIGINT建立一个处理程序,   然后可以从中调用该处理程序   SIGINT所在的任何线程   递送

但请继续阅读

  

信号可能会指向   整个过程或特定过程   螺纹即可。如果

,信号是线程导向的      

它是作为直接结果生成的   执行特定的   内部的硬件指令   线程的上下文( SIGBUS, SIGFPE, SIGILL, and SIGSEGV

我引用TLPI

答案 1 :(得分:6)

不,问题标题。

问题正文:对于您要求的特定信号,是(否则:取决于)。导致段错误的线程将收到信号。

请参阅signal(7)

A signal may be generated (and thus pending) for a process as a whole (e.g.,
when sent using kill(2)) or for a specific thread (e.g., certain signals, such
as SIGSEGV and SIGFPE, generated as a consequence of executing a specific
machine-language instruction are thread directed [...].