免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2458 | 回复: 5
打印 上一主题 下一主题

UNIX环境高级编程有关僵死进程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-04 20:49 |只看该作者 |倒序浏览
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

论坛徽章:
0
2 [报告]
发表于 2007-04-04 21:27 |只看该作者
因为你开启了两个进程,子进程又开启了一个子进程, 当然要打印两次了.

论坛徽章:
0
3 [报告]
发表于 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后面加的一条打印语句是否能够打印出来. 呵呵

论坛徽章:
0
4 [报告]
发表于 2007-04-04 22:30 |只看该作者
还有一点: 为什么两个打印都是:"parent pid=1"呢? pid=1的进程只有最原始的进程, 也就是inti进程, 你是不是写得不对?? 除非你是在做内核才有可能. 再说, 也没有可能两个进程的号是一样的.
呵呵, 有保密工作就无所谓了.

论坛徽章:
0
5 [报告]
发表于 2007-04-04 22:43 |只看该作者
SORRY, 我的上面的分析错了, 两个打印都是:"parent pid=1"的问题是这样的, 因为你在后面sleep(2), 就等两个"父进程"都退出了, 所以后两个子进程的parents都是"父进程"的父进程了,也就是init进程. 假如你把sleep(2);注释掉, 就是两个不同的值了. 两个数就随机的,但肯定不会相同,呵呵

论坛徽章:
0
6 [报告]
发表于 2007-04-08 11:09 |只看该作者
shagpg2008

解释的蛮清楚的..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP