Unix Fork()的代码源,流程图

Unix Fork()的代码源,流程图,unix,process,fork,pid,Unix,Process,Fork,Pid,我有这个流程图,我要做的源代码!!! 请检查它是否正确 这是我的解决方案 (a) #包括 内部主(空){ int i; 对于(i=0;i

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

这是我的解决方案

(a)

#包括
内部主(空){
int i;
对于(i=0;i<3;i++)
{
如果(!fork())
打破
}
while(wait(NULL)!==-1);//避免出现僵尸进程??
第二种解决方案(b):

#包括
内部主(空){
inti,pid;
对于(i=0;i0)
打破
}
while(等待(空)!=-1);

PS:我还必须包含注释,以指示我必须在何处包含将运行每个子级的“exec”?

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

解决方案(a)或多或少是正确的。我们可以争论选择
wait()
还是
waitpid()
,并且您应该
#包括
来声明您使用的等待函数。您还没有显示在哪里执行
exec()
,这意味着我们不能说您是否会遇到子进程等待零个子进程的问题-这很笨拙,但不会影响正确性。(就个人而言,如果(fork()==0)
,我会写
,因为我认为它比
!fork()更清晰)
,特别是因为返回值0表示进程成功分叉,而
!fork()
读取“not fork”,这很容易表示“not fork”


解决方案(b)也或多或少是正确的,除了
exec()
的位置不同,并且如果
fork()
失败,您将执行循环的时间比您应该执行的时间长一点,但这也不可能是一个主要问题。主要问题是“一个进程如何判断它是原始进程还是子进程之一”?您没有显示区分原始进程和各种子进程所需的控制信息恩。此外,如果您要设置管道或其他任何东西,则未显示。

为什么有这么多“!”和“?”?您的键盘有问题吗?它们都有问题。在这两个版本中,子进程都将调用wait(),这不是您想要的。
           #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??
           #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);