一、Kill命令
1、Kill命令: kill -信号编号/信号名 pid
2、Kill命令其实是用来发送信号的,我们常用的Kill -9 pid只是给某个进程发送9号信号而已,而不是说杀死该进程。
二、Kill函数
1、作用:给指定进程发送指定信号。(不一定会杀死进程,取决于发送的是什么信号)
2、函数原型、返回值(man 2 kill 查看)
①函数原型:int kill(pid_t pid, int sig);
②返回值:On success (at least one signal was sent), zero is returned. On error, -1 is returned, and errno is set appropriately.(ID非法、信号非法、普通用户杀死root用户进程)
3、函数参数
①pid:指定进程的进程ID,注意用户的权限,比如普通用户不可以杀死1号进程(init)。
pid>0:发送信号给指定进程
pid=0:发送信号给与调用kill函数进程属于同一进程组的所有进程
pid<0:发送信号给pid绝对值对应的进程组
pid=-1:发送给进程有权限发送的系统中的所有进程
②sig:对于sig参数,建议使用信号名(宏名)而不是信号编号,因为涉及到跨平台的程序时,可能因为不同平台信号编号不同会导致错误。
4、进程组:进程组是一个或多个进程的集合,通常它们与一组作业相关联,可以接受来自同一终端的各种信号。每个进程组都有一个组长,进程组的ID和进程组长ID一致。
5、权限保护:root用户可以发送信号给任何用户,而普通信号不可以向系统用户(的进程)或者其他普通用户(的进程)发送任何信号。普通用户只可以向自己创建的进程发送信号。
三、思考:在命令行执行:cat|cat|cat|cat时,如果杀死第一个cat为什么后面的cat也会关闭?
答:因为第一个cat被杀死后,管道的写端就关闭了,第二个cat读不到数据就返回0,继而关闭,后面的cat类似。