是SIGSEGV交付给每个线程?

Met*_*est 15 c linux signals memory-management

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

cni*_*tar 22

首先

信号处理是整个过程; 进程中的所有线程对每个信号共享相同的处置.如果一个线程使用sigaction()为SIGINT建立一个处理程序,那么可以从传递SIGINT的任何线程调用该处理程序.

但请继续阅读

可以将信号作为整体或特定线程引导到该过程.如果信号是线程导向的

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

我引用了TLPI.

  • 是的。mmap、mprotect 等,影响整个过程。SIGSEGV 总是传递给导致它的线程。 (2认同)

Dam*_*mon 6

不,问题标题.

问题正文:对于你要求的特定信号,是(否则:取决于).导致段错误的线程将接收信号.

信号(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 [...].
Run Code Online (Sandbox Code Playgroud)

  • 因为问题是关于"to _each_ thread".`SIGSEGV`被传递给_one_ thread(导致它的那个).因此,没有.(但是,当然如果它没有被处理,它可能(通常会)杀死整个过程,这显然会影响每个其他线程 - 但是信号不会传递给每个线程.) (3认同)