【问题标题】:when signal will be processed in unix?什么时候信号将在 unix 中处理?
【发布时间】:2016-12-18 00:11:20
【问题描述】:

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

【问题讨论】:

标签: unix linux-kernel signals


【解决方案1】:

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

信号可以通过不同的方式产生。

  • 它们可以由内核中的设备驱动程序生成(例如,tty 驱动程序响应中断、终止或停止键或响应后台进程的输入或输出)。
  • 它们可以由内核生成,以响应紧急的内存不足情况。
  • 它们可以由处理器异常生成,以响应进程本身在执行期间所做的事情(非法指令、除以零、引用非法地址)。
  • 它们可以由另一个进程(或接收进程本身)通过kill(2) 直接生成。
  • SIGPIPE 可以作为写入没有读取器的管道的结果而生成。

但在任何情况下,信号都是由内核传递给接收进程的,因此通过内核模式转换。

内核可能需要强制进行这种转换——先于接收进程——以传递信号(例如,在处理器 A 上运行的受 CPU 限制的进程被在处理器 B) 上运行的不同进程。

在某些情况下,信号可能由内核本身进程处理(例如,使用SIGKILL -- 或在未配置信号处理程序时使用其他几个)。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请注意,SIGSTOP 也不能由进程处理,实际上是指示内核停止进程,直到收到 SIGCONT。
    猜你喜欢
    • 2014-07-21
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多