向进程发送信号:kill, 会发现一个规律,


 信号是unix中最古老的进程通信的一种方式,他是软件层次上对中断机制的模拟,是一种异步通信方式,信号可以实现用户空间进程和内核空间进程的交互,内核进程可以利用他通知用户空间进程发生了哪些系统事件,我们可以任何时候给进程发送信号而无需知道进程的状态,如果进程当前并未处于执行态,则信号则会由内核保存起来,如果进程是阻塞状态,那么信号传递会被延迟,直到阻塞结束时才会传递给进程。

 会发现一个规律,前32种信号会有各种不同的名称,后32种会以“SIGRTMIN”或者“SIGRTMAX”开头,前者是从unix继承下来的信号,称为不可靠信号(也称为非实时信号),后者为了解决“不可靠信号”的问题进行了更改和扩充的信号形成了可靠信号(也称为实时信号)

如果想要了解可靠与不可靠信号,需要了解信号的生命周期:

一个完整的信号周期可以分为三个重要阶段,三个重要阶段有四个重要事件刻画的:信号产生,信号在进程中注册,信号在进程中注销,执行信号处理函数

kill()函数和熟知的kill系统命令一样,可以发送信号给信号和进程组(实际上kill系统命令只是kill函数的一个用户接口),需要注意的是他不仅可以终止进程(发送SIGKILL信号),也可以向进程发送其他信号。

与kill函数不同的是raise()函数允许进程向自身发送信号。

在默认情况下,kill命令向进程发送TERM信号,这个信号表示请求终止某项操作。但是,使用kill命令是否一定可以终止一个进程,答案是否定的,既然kill命令向程序发送一个信号。那么这个信号就应该能够被程序捕捉。程序也可以封锁或者干脆忽略捕捉到的信号。只有在信号没有被程序捕捉到的情况下,系统才会执行默认操作。

 然而,有一些进程的生命力是如此的顽强,以至于kill都不能影响到他们。这种情况常常是由一些退化的I/O虚假锁定造成的。

 

相关内容