【发布时间】:2016-12-18 00:11:20
【问题描述】:
信号何时开始在 unix 中执行?系统进入内核模式时是否会处理信号?还是在收到信号时立即?我假设它会在收到时立即处理。
【问题讨论】:
标签: unix linux-kernel signals
信号何时开始在 unix 中执行?系统进入内核模式时是否会处理信号?还是在收到信号时立即?我假设它会在收到时立即处理。
【问题讨论】:
标签: unix linux-kernel signals
信号是允许用户空间进程接收异步通知的 Unix 机制。因此,信号总是由内核“传递”。因此,如果不转换到内核模式,就不可能传递信号。因此,在没有内核参与的情况下谈论进程“接收”(或发送)信号是没有意义的。
信号可以通过不同的方式产生。
kill(2) 直接生成。 SIGPIPE 可以作为写入没有读取器的管道的结果而生成。 但在任何情况下,信号都是由内核传递给接收进程的,因此通过内核模式转换。
内核可能需要强制进行这种转换——先于接收进程——以传递信号(例如,在处理器 A 上运行的受 CPU 限制的进程被在处理器 B) 上运行的不同进程。
在某些情况下,信号可能由内核本身为进程处理(例如,使用SIGKILL -- 或在未配置信号处理程序时使用其他几个)。
实际上调用进程的信号处理程序是通过操纵进程的用户空间堆栈来完成的,以便在从内核模式返回时调用信号处理程序,然后,如果/当信号处理程序返回时,最初执行的代码可以恢复。
至于何时处理它,这取决于许多不同的因素。
【讨论】:
接收到信号的进程会立即检测到该信号。 根据信号类型,进程可能会使用默认处理程序处理它,可能会忽略它或可能执行自定义处理程序。这在很大程度上取决于过程是什么以及它接收到什么信号。例外是 kill 信号 (9),它被内核处理并终止应该接收它的进程的执行。
【讨论】: