Fork()的代码源,Diagram流程

时间:2012-02-19 21:42:28

标签: unix process fork pid

我有这个流程图,我必须做代码源! 请检查是否正确

enter image description here

这是我的解决方案

A)

           #include <unistd.h>
             int main(void) {
             int i;
          for (i= 0; i < 3; i++)
          {
            if(!fork()) 
             break;
                      }

         while(wait(NULL) !==-1);//to avoid the appearance of zombies processes??

第二个解决方案b):

           #include <unistd.h>
             int main(void) {
             int i,pid;
            for(i=0; i<3;i++)
             {
              pid=fork();
             if (pid>0)
               break;
                       }
            while(wait(NULL)!=-1);

PS:我还要包括评论,以表明我必须包含每个孩子的“”执行“”?

1 个答案:

答案 0 :(得分:2)

在这两个程序中,您需要合理化缩进,并在末尾包含缺少的括号。

解决方案(a)或多或少是正确的。我们可以争论wait() vs waitpid()的选择,您应#include <sys/wait.h>声明您使用的等待函数。你还没有表明你会在exec()做什么,这意味着我们不能说你是否遇到了等待零孩子的子进程的问题 - 这是笨拙的,但不会影响正确性。 (就个人而言,我写if (fork() == 0)因为我认为它比!fork()更清晰,特别是因为返回值0表示进程成功分叉,而!fork()读取'not fork',可能很容易意味着'没有叉'。

解决方案(b)也或多或少是正确的,除了exec()的位置不同,如果fork()失败,你将执行比你想要的更长的循环,但同样不太可能成为一个重大问题。主要问题是“流程如何判断它是原始的还是其中一个孩子”?您尚未显示区分原始进程和各种子进程所需的控制信息。此外,如果您要设置管道或其他任何东西,则不会显示。