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