MY SOFTHOUSE
BOOKMARK
SOFTWARE
FRIEND
EMAIL
EDIT
SIGN OUT
HELP
 
  首页   资讯   网摘   软件下载   问知   动漫娱乐   软件供求   软件商城   论坛   
 资讯
 资讯 >> 编程语言 >> C/C++
email给朋友】 浏览字号:【 】 【打印】 【关闭窗口
相关资讯  
相关文摘  
相关软件  
 



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

    #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 使用的程序,因为我的程序以前也是有很多死进程,后来使用上面的代码后,就没了


出处: 开发者在线 日期: 2008-7-21 好: 一般: 差:
 
评论
  发表评论 投票: 一般
 
通知管理员(希望管理员根据你的评论修改软件信息)
  TrackBack
 
返回主页 | 关于我们 | 免责声明 | 联系广告| 读者投稿 | 友情链接 | 诚聘英才
  Copyright © 2004-2008 Forlink Technologies All Rights Reserved 
版权所有 时力科技 联系:客户服务中心 京ICP证030637号