免费注册 查看新帖 |

Chinaunix

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

调用fork()后,为什么选择语句两个分支都执行?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-19 14:05 |只看该作者 |倒序浏览
为什么一个进程调用了fork函数后,总是会用if-elseif-else写三个分支,分别执行子进程的代码和父进程的代码??

如有进程A.c(片断)
p=fork();
if (p<0)
        printf("error ocurred!\n");
else if (p==0){
        printf("this is child process with pid of %d\n",getpid());
        /*some other codes*/
}else{
        printf("this is parent process with pid of %d\n",getpid());
        /*some other codes*/
}

这里只有一个进程(A),而且是选择语句,为什么两个输出语句都会输出??

哪位高手指点一下, 我刚学..

[ 本帖最后由 JasonXZ 于 2008-8-19 14:10 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-19 14:16 |只看该作者
没人知道吗?
还是我没说清楚.

论坛徽章:
0
3 [报告]
发表于 2008-08-19 14:19 |只看该作者
你fork了一下,就有两个进程,一个子进程,一个父进程.你的程序里面子进程和父进程都输出了信息,所以当执行到子进程时输出一条,执行到父进程时再输出一条,也就是说你的两个分支都会执行到,写if-else-是为了判断到底是哪个进程在执行这段代码......可能是你的理解不够透彻的原因.建议你找个比较了解这块的人当面请教一下,这个东西当时我也是看不懂,找人问才问明白的.

[ 本帖最后由 lottiwang 于 2008-8-19 14:21 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-08-19 14:26 |只看该作者
谢谢
身边暂时找不到强人

我知道是两个进程都会执行, 不过, 两个进程都会执行A中fork()后面的代码吗?

论坛徽章:
0
5 [报告]
发表于 2008-08-19 15:00 |只看该作者
是的,两个进程都执行fork后面的代码,
他们的代码段是相同的,不同的是fork的返回值,
所以两句话都输出,但是是被不同的进程输出的。

论坛徽章:
0
6 [报告]
发表于 2008-08-19 15:10 |只看该作者
Thanks..似乎明白了, 是不是这样:
A相当于父进程, 它调用fork(). fork()产生了子进程, 而子进程把父进程的东西copy过来, 包括这段代码, 于是父子进程中都要执行这段代码...
不对啊, 子进程似乎只执行fork后的代码, 因为全部执行的话, 就又fork了. 可为什么它只执行fork后的代码呢? 怎么控制的呢?

论坛徽章:
0
7 [报告]
发表于 2008-08-19 15:17 |只看该作者
子进程从fork之后才开始执行阿,
虽然父子代码段相同,但是执行的不一样。

论坛徽章:
0
8 [报告]
发表于 2008-08-19 15:37 |只看该作者
pid = fork() ;

    if(pid < 0 )
    {
         /* 这里pid为-1,fork函数失败 */
         /* 一些可能的原因是 */
         /* 进程数或虚拟内存用尽 */
         perror("The fork failed!");
         return -1;
     }
     else if(pid == 0)
     {
         /* pid为0,子进程 */
         /* 这里,我们是孩子,要做什么? */
         /* ... */
         /* 但是做完后, 我们需要做类似下面: */
         _exit(0);
      }
      else
      {
         /* pid大于0,为父进程得到的子进程号 */
         printf("Child's pid is %d\n",pid);
      }

论坛徽章:
0
9 [报告]
发表于 2008-08-19 16:09 |只看该作者
谢谢两位
明白了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP