###########大家来讨论一下僵死进程的问题###########

liyifang 2003-06-03 03:47:08
最近在一本书上看到一个通过2次fork来避免僵死进程的例子:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>

main()
{
pid_t pid;

pid=fork();

if(pid<0)
printf("fork error\n");
else if(pid==0){
pid=fork();
if(pid<0){
printf("fork error\n");
}
else if(pid>0){
printf("first child\n");
exit(0);
}
sleep(2);
printf("second child,parent id is %d\n",getppid());
exit(0);
}

if(waitpid(pid,NULL,0)!=pid)
printf("waitpid error\n");

printf("parent\n");
exit(0);
}

看后有如下疑问:只调用一次fork,且父进程不调用waitpid,在父进程退出后子进程的父进程变为init进程,子进程也不会成为僵死进程,为什么要调用2次?另外在子进程中直接调用setpgrp()函数也可以使其父进程变为init进程,为何一定要2次fork?还有那为兄弟对进程组比较情况,能否介绍一下?


...全文
27 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyifang 2003-06-04
  • 打赏
  • 举报
回复
谢谢,已经明白为什么要fork2次了。我看的那本书是翻译过来的,翻译的不是很好,英文的更好理解些:)
cao_elsie 2003-06-03
  • 打赏
  • 举报
回复
你可能没有理解僵死进程的意思,如果父进程没有调用waitpid而子进程又先于父进程退出的情况下,因为子进程不会被init进程接管,会出现僵死进程,因此如果你在程序中不希望父进程调用waitpid同时又不希望出现僵死进程的情况下要fork两次,这样第一个子进程通过父进程调用waitpid回收资源,而第二个子进程就由init进程接管。书中的原文说的就是If we want to write a process so that it forks a child but we don't want to wait for the child to complete and we don't want the child to become a zombie until we terminate, the trick is to call fork twice.

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧