免费注册 查看新帖 |

Chinaunix

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

简单的fork问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-28 21:18 |只看该作者 |倒序浏览
#include <stdio.h>;
#include <sys/types.h>;
#include <unistd.h>;
int main()
{
        pid_t pid1,pid2;
               
        printf ("ID beford fork():%d\n",getpid());
        pid1=fork();
        pid2=fork();
        if (pid1<0)       
                printf ("Create First Child Error\n";
        else if (pid2<0)       
                printf ("Create Second Child Error\n";
        else if (pid1==0)
                printf ("Child1's PID is %d\n",getpid());
        else if (pid2==0)
                printf ("Child2's PID is %d\n",getpid());
        else
                printf ("arent's PID is %d\n",getpid());
        exit(0);
}

////////////////////////////////////////////////////////////////////////////

[root@X718 intercommu]# ./a.out
PID beford fork():3324
Child1's PID is 3326
Child1's PID is 3325
Child2's PID is 3327
Parent's PID is 3324

结果有点想不通,可以解释一下吗?

论坛徽章:
0
2 [报告]
发表于 2003-05-28 22:16 |只看该作者

简单的fork问题。

这个结果输出是对的,画一个图是比较好理解的,我这里说一下:
首先运行a.out假设产生进程A,A可以肯定是父进程,将会打印出PID before fork():3324,并继续运行,当遇到PID1=fork();时,将会变成两个进程,一个是A不变,另一个是子进程,假设为B,由进程的继承性可以知道,对于A来说,PID1肯定不等于0,对于B来说,PID1肯定等于0,同时两个进程(A和B)都继续向下运行,当A遇到PID2=fork()时,将会再次变成两个进程,一个是A不变,另一个假设为C,这里A中PID2肯定不等于0,同时A中的PID1也不等于0,而C中PID2肯定等于0;而进程B遇到PID2=fork()后,也分成两个进程,一个是B不变,另一个是D进程,同样由于进程的继承性可知,B中的PID1=0,PID2肯定不等于0,而D是B的子进程,所以D将继承B的变量,也就是D中的PID1=0,而PID2不等于0,这样各个进程继续执行,由于B和D中的PID1都为0,所以将会有两个child输出,而B和D属于两个不同的进程,所以打印出child1的PID为两个,同样C中仅有PID2为0,所以将打印出child2的PID,而进程A中的输出就比较明显了,不知道楼主明白了没有?其实可以使用gdb来调试程序,比较好看出来输出的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP