zoukankan      html  css  js  c++  java
  • Linux杀死fork产生的子进程的僵尸进程defunct

    僵尸进程 就是 已经结束,但是还没有清理出去的.用kill -9 $PID 也无法杀死.

    所以程序中应该避免出现僵尸进程.

    用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

    转载请注明出处:http://www.cnblogs.com/ayanmw 多谢

    ------------------------------------------------------------------------------------------------

    一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。

  • 相关阅读:
    while循环
    三元运算符
    switch用法
    if判断
    位运算
    逻辑运算符
    赋值运算符和比较运算符
    算术运算符
    数据类型的转换
    线程同步之(条件变量)
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2308155.html
Copyright © 2011-2022 走看看