龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

下面的源码中搬掉僵尸

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
#include #include #include #include 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()) perror("childpid"); else if(c

  #include

  

#include

  

#include

  

#include

  

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

  

精彩图集

赞助商链接