【问题标题】:code source of Fork(), Diagram processFork()的代码源,Diagram流程
【发布时间】:2012-02-19 21:42:28
【问题描述】:

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

这是我的解决方案

一)

           #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”!?

【问题讨论】:

  • 为什么这么多“!”和 ”?” ?你的键盘有问题吗?
  • 他们都错了。在这两个版本中,子进程都会调用 wait(),这不是你想要的。

标签: unix process fork pid


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多