当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

搬掉下面的源码中僵尸程序

      #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <string.h>
    extern int errno;

    main()
    {
    char c, string[100];
    FILE * fp;
    int k, s, childpid;
    printf("test in beginning!
    ");

    while((c = getchar()) == ' ');

    for(;;)
    {
    if((childpid = vfork()) < 0)
    perror("childpid");
    else if(childpid ==0 )
    {
    childpid=getpid();

    printf("child %d in active!
    ", childpid);
    while((c = getchar()) != '
    ')
    putchar(c);

    printf("
    the child %d must quit!

    ", childpid);
    _exit(0);
    }
    }
    }

    增加
    else if (childpid > 0)
    {
    sigignore (SIGCHLD);
    }

    僵尸出现的原因是子进程默认将资源归还给副进程,但是你的父进程先子进程而亡,造成子进程变成"孤儿",结束后变成"僵尸"
    忽略SIG CHILD信号是将子进程的控制权交给自己的父进程(一般就是你的login shell)这样就不会出现僵尸了

 


    我不知道楼上的用法,但是我估计会有问题,我认为正确的处理方法是在vfork之前加上信号处理机制,如:signal(SIG_CHLD, SIG_IGN);这条语句的意思是,忽略子进程退出而产生的SIG_CHLD信号,交给超级服务器去处理!

 

    zhongjl:
    在vfork前加上信号处理函数:
    signal(SIG_CHLD, Proc_CHLD);

    void Proc_CHLD(int SIGNO)
    {
    int pid = -1;
    int stat;
    while(pid=waitpid(0, &stat, WHNONG);
    }

 

    我同意zhongjl 使用的程序,因为我的程序以前也是有很多死进程,后来使用上面的代码后,就没了

相关内容
赞助商链接