linux之父进程使用kill函数杀死子进程方式
作者:发如雪Jay
这篇文章主要介绍了linux之父进程使用kill函数杀死子进程方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
linux父进程使用kill函数杀死子进程
父进程循环创建5个子进程,并且父进程杀死第三个创建的子进程。
代码:kill.c
#include <stdlib.h> #include <stdio.h> #include <signal.h> #include <sys/types.h> #include <unistd.h> void sys_err(const char * str) { perror(str); exit(1); } int main() { //int ret = kill(getpid(),SIGKILL); //if(ret==-1) sys_err("kill error"); pid_t pid,q; int i; int n = 5; for(i=0;i<n;i++){ pid = fork(); if(pid==-1) sys_err("fork error"); else if(pid==0) break; if(i==2) q = pid; } if(i < 5){ while(1){ printf("I'm child %d,getpid = %u\n",i,getpid()); sleep(1); } } else{ sleep(1); kill(q,SIGKILL);//在父进程中杀死第三个创建的子进程 while(1); } return 0; }
结果:
第一次打印了5个进程,第二次打印少了第2个进程
linux下kill函数的相关用法
kill并不是杀死的意思,而是发信号
1.自己杀死自己
int main(int argc,char *argv[]) { kill(getpid(),SIGKILL); printf("hello\n"); return 0; }
2.子进程杀死父进程
int main(int argc,char *argv[]) { pid_t pid; int i=0; int n=3; for(i=0; i<n; i++) { //创建子进程 pid = fork(); if(pid<0) { perror("fork error"); return -1; } else if(pid==0) { break; } } if(i==n) { printf("father process,pid==[%d],child pid == [%d]\n",getpid(),pid); sleep(30); } //第一个子进程 if(i==0) { printf("the first child,pid==[%d]\n",getpid()); //子进程杀死父进程 kill(getppid(),SIGKILL); } //第二个子进程 if(i==1) { printf("the second child,pid==[%d]\n",getpid()); } if(i==2) { printf("the three child,pid==[%d]\n",getpid()); } return 0; }
3.父进程杀子进程(待验证)
以下杀伤范围太广,很少用
4.杀死同组所有进程
kill(0,SIGKILL);
5.杀死所有系统中有权限的进程,(可以杀bash)
kill(-1,SIGKILL);
拓展:raise(给当前进程发指定信号)和abort函数(不常用)
raise(signo) == kill(getpid(), signo);
abort() == kill(getpid(), SIGABRT);
abort(给自己发送异常终止信号 6) SIGABRT,并产生core文件)举例:
int main(int argc,char *argv[]) { //相当于kill(getpid(),SIGABRT) abort(); printf("hello\n"); return 0; }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。