【发布时间】:2011-09-25 21:03:30
【问题描述】:
我在 Linux 中有一个多线程程序。我有兴趣查看某些内存区域是否已在特定时间段内写入。为此,我只授予对这些内存页面的读取访问权限,并为 SIGSEGV 安装信号处理程序。现在我的问题是,每个线程是否会为自己调用信号处理程序。假设线程 1 写入某个禁止的内存区域,它会是执行信号处理程序的那个吗?
【问题讨论】:
标签: c linux memory-management signals
我在 Linux 中有一个多线程程序。我有兴趣查看某些内存区域是否已在特定时间段内写入。为此,我只授予对这些内存页面的读取访问权限,并为 SIGSEGV 安装信号处理程序。现在我的问题是,每个线程是否会为自己调用信号处理程序。假设线程 1 写入某个禁止的内存区域,它会是执行信号处理程序的那个吗?
【问题讨论】:
标签: c linux memory-management signals
首先
信号处置是全过程的; 一个进程中的所有线程共享 每个信号的配置相同。如果 一个线程使用 sigaction() 来 为 SIGINT 建立一个处理程序, 然后可以从调用该处理程序 SIGINT 所在的任何线程 已送达。
请继续阅读
信号可能被定向到 整个过程或特定的过程 线程。信号是线程导向的,如果
它是作为直接结果生成的 执行特定的 内的硬件指令 线程上下文 (
SIGBUS, SIGFPE, SIGILL, and SIGSEGV)
我引用TLPI。
【讨论】:
不,根据问题标题。
对于问题主体:对于您要求的特定信号,是的(否则:取决于)。导致段错误的线程将收到信号。
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 被传递给 one 线程(导致它的线程)。因此,没有。 (但是,当然,如果不处理它,它可能(通常会)杀死整个进程,这显然会影响所有其他线程——但信号不会传递给每个线程。)