2012-02-19 12 views
1

我有这个过程图,我必须做代码源! 请检查其正确Fork的代码源代码(),图表过程

enter image description here

的是我的

一)

  #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:另外我必须包括评论以表明我在哪里必须包括将运行每个孩子的“”exec“”!

+0

为什么这么多“!”和“?”?键盘有问题吗? – cnicutar 2012-02-19 21:44:51

+0

他们都是错的。在这两个版本中,子进程都会调用wait(),这不是你想要的。 – wildplasser 2012-02-19 21:45:58

回答

2

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

解决方案(a)或多或少是正确的。我们可以选择wait()waitpid(),并且您应该使用#include <sys/wait.h>来声明您使用的等待功能。你没有显示你会在哪里做exec(),这意味着我们不能说你是否会遇到等待零孩子的子进程问题 - 这是不明智的,但不会影响正确性。 (就我个人而言,我会写if (fork() == 0),因为我认为它比!fork()更清晰,尤其是因为返回值0意味着成功分叉的过程,而!fork()读取的是“不分叉”,这可能更容易意味着“没有分叉”

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