Linux杀死fork产生的子进程的僵尸进程defunct
2011-12-30 23:53
495 查看
僵尸进程 就是 已经结束,但是还没有清理出去的.用kill -9 $PID 也无法杀死.
所以程序中应该避免出现僵尸进程.
用fork之后,父进程如果没有wait /waitpid 等待子进程的话,子进程完毕后,就成了僵尸进程.
但是父进程如果等待wait/waitpid的话,就没法干别的事情了...尤其在多个子进程的情况下.所以 中断 信号量 是一个好办法:
参考自:http://topic.csdn.net/t/20020424/21/673887.html
所以程序中应该避免出现僵尸进程.
用fork之后,父进程如果没有wait /waitpid 等待子进程的话,子进程完毕后,就成了僵尸进程.
但是父进程如果等待wait/waitpid的话,就没法干别的事情了...尤其在多个子进程的情况下.所以 中断 信号量 是一个好办法:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> void sig_child(){ pid_t pid; int status; while((pid = waitpid(-1, &status, WNOHANG)) > 0) {} //Key !!!!!!!! wait or waitpid return; } void nodefunct_sig(){ signal(SIGCHLD,sig_child);//prevent defunct int child=0; pid_t status=0; int i=0; while(1){ if(child=fork()==0){ childf(); printf("child(%d):I will be exit...pgid=%d\n",getpid(),getpgid(getpid()));//getpgrp() abort(); char cmd[1024]=""; sprintf(cmd,"kill -9 %d",getpid()); system(cmd); exit(5); }else{ printf("Parent(%d):Main process...\n",getpid()); //kill(child,SIGABRT); system("ps -A|grep a.out"); sleep(3); } printf("Parent: waitting child...pgid=%d\n\n",getpgid(getpid())); //waitpid(child,&status, } } void main(){ nodefunct_sig(); }
参考自:http://topic.csdn.net/t/20020424/21/673887.html
相关文章推荐
- 【转】Linux杀死fork产生的子进程的僵尸进程defunct
- 杀死Linux中的defunct进程(僵尸进程)的方法指南
- linux下僵尸进程(Defunct进程)的产生与避免
- linux用kill()函数杀死由fork()函数产生的子进程
- 通过两次fork避免产生僵尸进程
- 为何要fork()两次来避免产生僵尸进程?
- Linux僵尸进程产生及如何避免2
- Linux 下 popen 函数引起的僵尸进程 defunct 以及解决办法
- 为什么要fork两次来避免产生僵尸进程
- linux—fork的那些事(僵尸进程)
- Linux如何杀死僵尸进程
- 为何要fork()两次来避免产生僵尸进程?
- linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程
- Linux下如何避免僵尸进程的产生
- Linux 僵尸进程产生及如何避免
- 杀死linux的僵尸进程
- 服务器产生大量僵尸进程,查询并杀死zombie
- Linux的僵尸进程产生原因及解决方法
- Linux下fork()&vfork()的区别、getenv()&setenv()函数以及僵尸进程、孤儿进程讲解
- Linux系统查找并且杀死僵尸进程