我有一个multithreading的Linux程序。 在某些记忆区域,我有兴趣看看它们是否在特定的时间段内被写入。 为此,我只给这些内存页面的读访问权限,并为SIGSEGV安装一个信号处理程序。 现在我的问题是,每个线程会自己调用信号处理程序。 说线程1写入一些禁止的内存区域,它将是一个执行信号处理程序?
首先
信号处理是全过程的; 一个进程中的所有线程都为每个信号分配相同的配置。 如果一个线程使用sigaction()为SIGINT建立一个处理程序,那么该处理程序可以从SIGINT传递到的任何线程中调用。
但请继续阅读
一个信号可以被引导到整个过程或者一个特定的线程 。 如果信号是线程定向的
它是在线程(
SIGBUS, SIGFPE, SIGILL, and SIGSEGV
)的上下文中执行特定硬件指令的直接结果而产生的,
我从TLPI
引用。
不,根据问题标题。
对于问题主体:对于你所要求的特定信号,是的(否则:取决于)。 引起段错误的线程将收到信号。
见信号(7) :
A signal may be generated (and thus pending) for a process as a whole (eg, when sent using kill(2)) or for a specific thread (eg, certain signals, such as SIGSEGV and SIGFPE, generated as a consequence of executing a specific machine-language instruction are thread directed [...].