6.8.1 kill、tkill和tgkill
kill函数的接口定义如下:
int kill(pid_t pid, int sig);
注意,不能望文生义,将kill函数的作用理解为杀死进程。
kill函数的作用是发送信号。
kill函数不仅可以向特定进程发送信号,也可以向特定进程组发送信号。
第一个参数pid的值,决定了kill函数的不同含义,具体来讲,可以分成以下几种情况。
-
pid>0:发送信号给进程ID等于pid的进程。
-
pid=0:发送信号给调用进程所在的同一个进程组的每一个进程。
-
pid=-1:有权限向调用进程发送信号的所有进程发出信号,init进程和进程自身除外。
-
pid<-1:向进程组-pid发送信号。
当函数成功时,返回0,失败时,返回-1,并置errno。
有一种情况很有意思,即调用kill函数时,第二个参数signo的值为0。
众所周知,没有一个信号的值是为0的,这种情况下,kill函数其实并不是真的向目标进程或进程组发送信号,而是用来检测目标进程或进程组是否存在。
如果kill函数返回-1且errno为ESRCH,则可以断定我们关注的进程或进程组并不存在。