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 5int 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 5int 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\n",i,getpid());sleep(1);}}else{kill(q,SIGKILL);while(1);}return 0; }
運行結果中,第一輪由i = 2 的孩子,后面的都不會有該孩子了。
?