Chinaunix

标题: UNIX环境高级编程有关僵死进程的问题 [打印本页]

作者: xiedehui1983    时间: 2007-04-04 20:49
标题: UNIX环境高级编程有关僵死进程的问题
UNIX环境高级编程 进程控制一章 程序8-5 我实现了 但是结果却和书上的不一样 请各位朋友赐教
代码如下:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>

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

    }
   if(waitpid(pid,NULL,0)!=pid)
       printf("waitpid error");
   exit(0);
}
书上的结果是:second child,parent pid=1
而我的运行的结果确是:
second child,parent pid=1
second child,parent pid=1
多了一次输出
我的环境是RedHat AS4
作者: shagpg2008    时间: 2007-04-04 21:27
因为你开启了两个进程,子进程又开启了一个子进程, 当然要打印两次了.
作者: shagpg2008    时间: 2007-04-04 22:09
我再解释一下: 原因就出在你第一个的fork上面.
int main()
{
   pid_t pid;
   if(pid=fork()<0)
........

"if(pid=fork()<0)" 应该是"if((pid=fork())<0)", 和你下面的那个fork一样, 这样就只打印一次了.
那为什么写成"if(pid=fork()<0)"就有两次呢?  因为pid是等于"fork()<0"这个表达式的值, 而在一般情况下, 这个表达式的值是0, 所以父进程和子进程就一起进入下面的"if(pid == 0)" 里面去了,这个时候就产生了两个进程,共四个进程,原先的父进程和子进程在下面的"if(pid > 0)"中就退出了, 所以在你后面的watpid(....)是没有执行的, 是后面产生的两个子程序打印了那两条语句. 你可以在watpid后面加一条打印语句看看能不能打印出来; 再把"if(pid=fork()<0)" 改成"if((pid=fork())<0)" 再试试看,是否和书上的一样了, 以及watpid后面加的一条打印语句是否能够打印出来. 呵呵
作者: shagpg2008    时间: 2007-04-04 22:30
还有一点: 为什么两个打印都是:"parent pid=1"呢? pid=1的进程只有最原始的进程, 也就是inti进程, 你是不是写得不对?? 除非你是在做内核才有可能. 再说, 也没有可能两个进程的号是一样的.
呵呵, 有保密工作就无所谓了.
作者: shagpg2008    时间: 2007-04-04 22:43
SORRY, 我的上面的分析错了, 两个打印都是:"parent pid=1"的问题是这样的, 因为你在后面sleep(2), 就等两个"父进程"都退出了, 所以后两个子进程的parents都是"父进程"的父进程了,也就是init进程. 假如你把sleep(2);注释掉, 就是两个不同的值了. 两个数就随机的,但肯定不会相同,呵呵
作者: b_liu    时间: 2007-04-08 11:09
shagpg2008

解释的蛮清楚的..




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2