kill函数/命令产生信号
kill命令产生信号:kill -SIGKILL pid
kill函数:给指定进程发送指定信号(不一定杀死)
int kill(pid_t pid, int sig); 成功:0;失败:-1 (ID非法,信号非法,普通用户杀init进程等权级问题),设置errno
sig:不推荐直接使用数字,应使用宏名,因为不同操作系统信号编号可能不同,但名称一致。
pid > 0: 发送信号给指定的进程。
pid = 0: 发送信号给 与调用kill函数进程属于同一进程组的所有进程。
pid < 0: 取|pid|发给对应进程组。
pid = -1:发送给进程有权限发送的系统中所有进程。
进程组:每个进程都属于一个进程组,进程组是一个或多个进程集合,他们相互关联,共同完成一个实体任务,每个进程组都有一个进程组长,默认进程组ID与进程组长ID相同。
权限保护:super用户(root)可以发送信号给任意用户,普通用户是不能向系统用户发送信号的。 kill -9 (root用户的pid) 是不可以的。同样,普通用户也不能向其他普通用户发送信号,终止其进程。 只能向自己创建的进程发送信号。普通用户基本规则是:发送者实际或有效用户ID == 接收者实际或有效用户ID
/*** killmyself.c ***/ #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<signal.h> #define N 5 int main() { int ret = kill(getpid(),SIGKILL); if(-1 == ret) exit(1); return 0; }
kill杀死指定子进程:
/*** killkid.c ***/ #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<signal.h> #define N 5 int main() { int i; pid_t pid,q; for(i = 0; i < N; i++) { pid = fork(); if(0 == pid) break; if(2 == i) { q = pid; } } if(i < 5) { while(1) { printf("I'm a child %d,getpid = %u ",i,getpid()); sleep(1); } } else { kill(q,SIGKILL); while(1); } return 0; }
运行结果中,第一轮由i = 2 的孩子,后面的都不会有该孩子了。