SIGSEGV 是不是交付给每个线程?

Posted

技术标签:

【中文标题】SIGSEGV 是不是交付给每个线程?【英文标题】:is SIGSEGV delivered to each thread?SIGSEGV 是否交付给每个线程? 【发布时间】:2011-09-25 21:03:30 【问题描述】:

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

【问题讨论】:

【参考方案1】:

首先

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

请继续阅读

信号可能被定向到 整个过程或特定的过程 线程。信号是线程导向的,如果

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

我引用TLPI

【讨论】:

也就是说 SIGSEGV 信号处理程序将被写入禁止内存的线程执行,对吧? @MetallicPriest 是的,但它是所有线程的相同处理程序。 它是否还取决于调用 mprotect 的线程?我认为 mprotect 是针对整个过程的,对吧? 是的。 mmap、mprotect 等会影响整个过程。 SIGSEGV 总是传递给导致它的线程。 有没有办法强制进程使用“通用”SIGSEGV 处理程序?或将故障重定向到特定的处理程序?不覆盖每个线程的默认处理程序..【参考方案2】:

不,根据问题标题。

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

见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 [...].

【讨论】:

你为什么说不,在描述中写到 SIGSEGV 是线程导向的? 因为问题是关于“到每个线程”。 SIGSEGV 被传递给 one 线程(导致它的线程)。因此,没有。 (但是,当然,如果不处理它,它可能(通常会)杀死整个进程,这显然会影响所有其他线程——但信号不会传递给每个线程。) 标题中的问题与正文中的问题不太匹配;他们要求相同的基本信息,但对一个“否”是对另一个“是”。因此,您可能需要调整答案,以明确您对哪一个说“不”。

以上是关于SIGSEGV 是不是交付给每个线程?的主要内容,如果未能解决你的问题,请参考以下文章

错误 A/libc:SkPath 中 0x00000018(代码=1)处的致命信号 11(SIGSEGV)

使用 Qt 的多线程应用程序有啥问题(错误 SIGSEGV)

Android 应用程序崩溃“libjsc.so”缺少堆栈跟踪崩溃:线程:SIGSEGV 0x0000000000000010

sigsegv 在 iPhone 上因 crittercism 崩溃

在停止等待协议实现中使用 pthread 时的 SIGSEGV

Java8 - 处理 Stream<Callable<...>> 的惯用方式,并行交付给非线程安全的消费者?