我在Linux中有一个多线程程序。 我对某些内存区域感兴趣,想知道它们是否在特定时间段内被写入。 为此,我只给那些内存页读取权限,并安装了SIGSEGV信号处理程序。 现在我的问题是,每个线程都会为自己调用信号处理程序吗? 比如说,线程1写入一些禁止访问的内存区域,它会执行信号处理程序吗?
我在Linux中有一个多线程程序。 我对某些内存区域感兴趣,想知道它们是否在特定时间段内被写入。 为此,我只给那些内存页读取权限,并安装了SIGSEGV信号处理程序。 现在我的问题是,每个线程都会为自己调用信号处理程序吗? 比如说,线程1写入一些禁止访问的内存区域,它会执行信号处理程序吗?
首先
信号处理是进程级别的;一个进程中的所有线程对于每个信号共享相同的处理方式。如果某个线程使用sigaction()为,例如,SIGINT建立了一个处理程序,那么该处理程序可以从任何接收到SIGINT的线程中调用。
但请继续阅读
一个信号可能被发送到整个进程或特定线程。如果
它是在线程上下文中的特定硬件指令的执行作为直接结果生成的(
SIGBUS、SIGFPE、SIGILL和SIGSEGV
),则该信号是针对线程的。
我在引用TLPI
的内容。
不,根据问题标题。
对于您所询问的特定信号,是的(否则:这取决于情况)。导致段错误的线程将接收该信号。
请参见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
信号只会发送给一个线程(即导致该信号的线程)。因此,答案是否定的。(当然,如果未处理该信号,它可能(通常会)杀死整个进程,这显然会影响到每个其他线程,但信号不会被发送到每个线程。) - Damon