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