在unix中何时处理信号?

在unix中何时处理信号?,unix,linux-kernel,signals,Unix,Linux Kernel,Signals,在unix中,信号何时开始执行?当系统进入内核模式时,信号是否会被处理?或者当它收到信号时立即?我假设它在接收时会立即被处理。接收它的进程会立即检测到一个信号。 根据信号类型,进程可能使用默认处理程序处理它,可能忽略它,或者可能执行自定义处理程序。这在很大程度上取决于过程是什么以及它接收到什么信号。异常是kill信号(9),它由内核处理并终止本应接收它的进程的执行。信号是允许用户空间进程接收异步通知的Unix机制。因此,信号总是由内核“传递”。因此,如果不转换到内核模式,就不可能传递信号。因此,

在unix中,信号何时开始执行?当系统进入内核模式时,信号是否会被处理?或者当它收到信号时立即?我假设它在接收时会立即被处理。

接收它的进程会立即检测到一个信号。
根据信号类型,进程可能使用默认处理程序处理它,可能忽略它,或者可能执行自定义处理程序。这在很大程度上取决于过程是什么以及它接收到什么信号。异常是kill信号(9),它由内核处理并终止本应接收它的进程的执行。

信号是允许用户空间进程接收异步通知的Unix机制。因此,信号总是由内核“传递”。因此,如果不转换到内核模式,就不可能传递信号。因此,在没有内核参与的情况下谈论进程“接收”信号(或发送信号)是没有意义的

信号可以以不同的方式产生

  • 它们可以由内核中的设备驱动程序生成(例如,tty驱动程序响应中断、终止或停止键,或者响应后台进程的输入或输出)
  • 它们可以由内核生成,以响应突发的内存不足情况
  • 它们可以由处理器异常生成,以响应进程本身在执行过程中所做的事情(非法指令、除以零、引用非法地址)
  • 它们可以由另一个进程(或接收进程本身)通过
    kill(2)
    直接生成
  • SIGPIPE
    可以在写入没有读卡器的管道时生成
但在每种情况下,信号都由内核传递到接收进程,因此通过内核模式转换

内核可能需要强制这种转换——抢占接收进程——以传递信号(例如,在处理器a上运行的CPU绑定进程被处理器B上运行的另一个进程发送信号的情况下)

在某些情况下,内核本身可以为进程处理信号(例如,使用
SIGKILL
——或者在未配置信号处理程序时使用其他几种方法)

实际上,调用进程的“信号处理程序”是通过操纵进程的用户空间堆栈来完成的,以便在从内核模式返回时调用信号处理程序,然后,如果/当信号处理程序过程返回时,可以恢复最初执行的代码

至于何时处理,这取决于许多不同的因素

  • 有些操作系统(即内核)操作永远不会被信号中断(这些操作通常是持续时间相对较短的操作),在这种情况下,信号将在完成后进行处理
  • 进程可能暂时阻止了信号传输,在这种情况下,信号将处于“挂起”状态,直到解除阻止为止
  • 由于多种原因,进程可能会被调出或不可运行——在这种情况下,在进程再次可运行之前,无法调用其信号处理程序
  • 为了传递信号而恢复进程可能会因中断和更高优先级的任务而延迟

注意,SIGSTOP也不能由进程处理,实际上是指示内核停止进程,直到收到SIGCONT。