进程可以通过系统调用kill函数向包括它本身在内的其他进程发送一个信号。如果程序没有发送该信号的权限,对kill函数的调用就将失败,失败的常见原因是目标进程由另一个用户所拥有。这个函数和shell命令完成相同的功能。
一、kill函数的定义
发送信号的kill函数的操作实际上是系统调用。
语法形式:
kill函数把参数sig给定的信号发送给由参数pid给出的进程号所指定的进程,成功时它返回0,失败则返回-1。
二、发送信号
【例】现在有一个程序main01.c的代码如下图所示,执行这个程序,然后在另一个进程中给这个正在执行的程序发送信号。
(1)现在有这样一个程序main01,编译并执行这个程序,此时会一直输出"hello"。main01.c具体代码如下:
(2)另外一个程序mykill.c如下,该程序用来发送信号:
先在一个终端中编译并执行第一个程序main01,这时会一直输出"hello":
然后再另一个终端中查看进程main01的pid,然后编译并执行第二个程序mykill:
main01的pid为11241:
编译并执行第二个程序mykill,执行mykill的时候顺便传参,传参的内容就是将信号发送给pid为多少的进程和要发送的信号的代号,在这里假设要给main01发送SIGINT信号,SIGINT信号为2:
这时进程main01就接收到了进程mykill向它发送的SIGINT信号,然后将进程结束掉。
【注意】
- 信号代号为15的信号就是系统kill命令默认发送的信号
(1)以代号为15的信号结束一个进程:
(2)通过kill结束这个进程:
- 信号代号为9的信号就是系统kill -9命令默认发送的信号,这个信号的响应方式不允许改变
(1)代号为9的信号杀死进程
(2)以kill -9命令杀死这个进程:
代号为9(kill -9)的信号是为了防止出现一个无论怎样都结束不掉的进程出现,所以不允许改变它的响应方式。