+ -
当前位置:首页 → 问答吧 → windows下gcc的问题可以在这问么?

windows下gcc的问题可以在这问么?

时间:2009-12-12

来源:互联网

原文如下:
代码:
提问:
先看一个程序   
  main()   
   {   
       pid_t    pid;   
       if(pid=fork()<0)   
       {   
           printf("error!");   
       }   
       else   
       {   
             if(pid==0)   
             printf("a\n");   
             else   
             printf("b\n");   
       }   
   }   
   结果是返回a,b或者b,a   
   因为fork调用将执行两次返回分别从子进程和父进程返回   
   由于父进程和子进程无关,父进程与子进程都可能先返回   
   
   在看一个程序   
   
   main()   
   {   
       pid_t    a_pid,b_fork;   
       if(a_pid=fork()<0)   
       {   
           printf("error!");   
       }   
       else   
       {   
             if(a_pid==0)   
             printf("b\n");   
             else   
             printf("a\n");   
       }   
   
       if(b_pid=fork()<0)   
       {   
           printf("error!");   
       }   
       else   
       {   
             if(b_pid==0)   
             printf("c\n");   
             else   
             printf("a\n");   
       }   
   }   
   
   如果是创建两个进程则出现结果   
   b   
   c   
   a   
   a   
   c   
   a   
   为什么会返回6个字母???????????
回答:
       事实上,理解fork()的关键在于它的返回点在哪里。fork最特殊的地方就在于他有两个甚至三个返回值,注意是同时返回两个值。其中pid=0的这个返回值用来执行子进程的代码,而大于0的一个返回值为父进程的代码块。第一次fork调用的时候生叉分为两个进程,不妨设为a父进程和b子进程。他们分别各自在第二次fork调用之前打印了b和a各一次;在第一次叉分的这两个进程中都含有   
   if(b_pid=fork()<0)   
   {   
   printf("error!");   
   }   
   else   
   {   
   if(b_pid==0)   
   printf("c\n");   
   else   
   printf("a\n");   
   }   
   }   
   这段代码。很明显,a父进程和b子进程在这段代码中又各自独立的被叉分为两个进程。这两个进程每个进程又都打印了a,c各一次。到此,在程序中总共打印三次a两次c和一次b。总共6个字母。   
   注:在第一次叉分为两个进程的时候父子进程含有完全相同的代码(第二次仍然相同),只是因为在父子进程中返回的PID的值不同,父进程代码中的PID的值大于0,子进程代码中的值等于0,从而通过if这样的分支选择语句来执行各自的任务。

这个好像是对的,讲得很有道理。

但又好像是错的,因为我的输出跟它的不同。
代码:
lucifer@DearBaby:~/C$ cat fork3.c
#include <unistd.h>
#include <sys pes.h>

main()   
   {   
       pid_t    a_pid,b_pid;   
       if(a_pid=fork()<0)   
       {   
           printf("error!");   
       }   
       else   
       {   
             if(a_pid==0)   
             printf("b\n");   
             else   
             printf("a\n");   
       }   
   
       if(b_pid=fork()<0)   
       {   
           printf("error!");   
       }   
       else   
       {   
             if(b_pid==0)   
             printf("c\n");   
             else   
             printf("a\n");   
       }   
   }   
lucifer@DearBaby:~/C$ ./a.out
b
c
c
b
c
c
lucifer@DearBaby:~/C$

于是我改了下printf的内容,安顺序abcd,结果。

代码:
lucifer@DearBaby:~/C$ cat fork3.c
#include <unistd.h>
#include <sys pes.h>

main()   
{   
   pid_t    a_pid,b_pid;   
   if(a_pid=fork()<0)   
   {   
      printf("error!");   
   }   
   else   
   {   
      if(a_pid==0)   
         printf("a\n");   
      else   
         printf("b\n");   
   }   

   if(b_pid=fork()<0)   
   {   
      printf("error!");   
   }   
   else   
   {   
      if(b_pid==0)   
         printf("c\n");   
      else   
         printf("d\n");   
   }   
}   
lucifer@DearBaby:~/C$ ./a.out
a
c
c
a
c
c
lucifer@DearBaby:~/C$

我不知道我的是怎么执行的,希望大侠解答,谢谢。。

作者: 小锐同学   发布时间: 2009-12-12

知道了,我太笨了。。。

作者: 小锐同学   发布时间: 2009-12-12

迷惑是正常的,想当初,我......

作者: onpduo   发布时间: 2009-12-13

你当初?

那你现在就是大侠咯~~

收我做徒弟吖~~~~~~

作者: 小锐同学   发布时间: 2009-12-14

我看了 我到觉得你发出来的那个说的是对的 但是我就不明白你是怎么理解的 能说出来分享一下吗

作者: huojing   发布时间: 2010-11-04

我怎么没有syspes头文件啊!

作者: HelloAndroid   发布时间: 2010-11-04

我试了一下好像我的是bbcccc,是不是跟电脑本身有关啊!

作者: HelloAndroid   发布时间: 2010-11-04

赋值的优先级比比较要低

作者: BigSnake.NET   发布时间: 2010-11-04

热门下载

更多