在unix中何时处理信号?
在unix中,信号何时开始执行?当系统进入内核模式时,信号是否会被处理?或者当它收到信号时立即?我假设它在接收时会立即被处理。接收它的进程会立即检测到一个信号。在unix中何时处理信号?,unix,linux-kernel,signals,Unix,Linux Kernel,Signals,在unix中,信号何时开始执行?当系统进入内核模式时,信号是否会被处理?或者当它收到信号时立即?我假设它在接收时会立即被处理。接收它的进程会立即检测到一个信号。 根据信号类型,进程可能使用默认处理程序处理它,可能忽略它,或者可能执行自定义处理程序。这在很大程度上取决于过程是什么以及它接收到什么信号。异常是kill信号(9),它由内核处理并终止本应接收它的进程的执行。信号是允许用户空间进程接收异步通知的Unix机制。因此,信号总是由内核“传递”。因此,如果不转换到内核模式,就不可能传递信号。因此,
根据信号类型,进程可能使用默认处理程序处理它,可能忽略它,或者可能执行自定义处理程序。这在很大程度上取决于过程是什么以及它接收到什么信号。异常是kill信号(9),它由内核处理并终止本应接收它的进程的执行。信号是允许用户空间进程接收异步通知的Unix机制。因此,信号总是由内核“传递”。因此,如果不转换到内核模式,就不可能传递信号。因此,在没有内核参与的情况下谈论进程“接收”信号(或发送信号)是没有意义的 信号可以以不同的方式产生
- 它们可以由内核中的设备驱动程序生成(例如,tty驱动程序响应中断、终止或停止键,或者响应后台进程的输入或输出)李>
- 它们可以由内核生成,以响应突发的内存不足情况
- 它们可以由处理器异常生成,以响应进程本身在执行过程中所做的事情(非法指令、除以零、引用非法地址)李>
- 它们可以由另一个进程(或接收进程本身)通过
直接生成李>kill(2)
可以在写入没有读卡器的管道时生成李>SIGPIPE
SIGKILL
——或者在未配置信号处理程序时使用其他几种方法)
实际上,调用进程的“信号处理程序”是通过操纵进程的用户空间堆栈来完成的,以便在从内核模式返回时调用信号处理程序,然后,如果/当信号处理程序过程返回时,可以恢复最初执行的代码
至于何时处理,这取决于许多不同的因素
- 有些操作系统(即内核)操作永远不会被信号中断(这些操作通常是持续时间相对较短的操作),在这种情况下,信号将在完成后进行处理李>
- 进程可能暂时阻止了信号传输,在这种情况下,信号将处于“挂起”状态,直到解除阻止为止李>
- 由于多种原因,进程可能会被调出或不可运行——在这种情况下,在进程再次可运行之前,无法调用其信号处理程序李>
- 为了传递信号而恢复进程可能会因中断和更高优先级的任务而延迟