处理同步信号

Shr*_*har 3 c unix signal-handling linux-kernel

我试图找到与处理异步信号相比处理同步信号(SIGSEGV、SIGILL 等)的资源。

典型的信号处理机制(例如使用 kill)在从内核到用户模式的控制转移时调用信号处理程序。我的理解是,“同步”信号更像是一个系统调用,因为控制立即转移到内核 - 可能是因为同步信号通常与 CPU 中断(内存保护等)相关联,并且无论如何都会调用内核处理程序。

  1. 在同步信号处理程序中使用其他“异步信号不安全”的 libc 函数是否安全?例如,我看到 Linux mprotect(2) 手册页在 SIGSEGV 处理程序中使用了 printf。如何确定在这些情况下是否可以使用函数?

  2. 典型的类 Unix 内核对同步信号的处理与其对异步信号的处理有何不同?是什么让它们“同步”?

Jea*_*nès 6

本质上没有同步和异步信号,但有些信号是异步传递的,而另一些则可以同步或异步传递。

传递总是相同的:如果设置,则调用用户模式下的信号处理程序。如果未设置,则使用默认行为(默认行为是终止进程,除了一些已完成忽略或暂停的信号)。

如果信号是由某些外部原因(例如其他人称为kill)发起的,则认为它们是异步传递的。在这种情况下,从进程的角度来看,发出和交付之间有时间:进程可以执行很多事情......

如果检测到应为其发出信号的某些内部运行时原因,则同步传递信号。例如,可以传递SIGSEGV或的错误内存访问、传递SIGBUS的浮点错误(如被零除)、SIGFPE错误指令 ( SIGILL) 等。在这种情况下,当前执行的代码/指令是错误的根源,然后立即发出信号,然后传递。在这种情况下,从过程的角度来看,在发射和交付之间没有任何事情发生。