【问题标题】:Does Fork() in UNIX create processes which run in unison or sequentially?UNIX 中的 Fork() 是否创建一致或顺序运行的进程?
【发布时间】:2012-11-13 22:16:17
【问题描述】:

当在类 Unix 操作系统(即 MINIX 3)中运行的程序中使用 fork() 函数时,它是否会创建许多独立处理的独立进程,因此可以彼此提前完成(即实际上是我想要的)还是会创建一系列仅按创建顺序完成的顺序流程。

这是我用于 fork() 的代码

    for(j = 0; j < num_fork_loops;) {
       if (fork() < 0) {
          printf("Fork has failed\n");
          exit(EXIT_FAILURE);
       }
       j++;
     }

感谢您的宝贵时间

【问题讨论】:

    标签: c process fork minix


    【解决方案1】:

    fork() 立即返回,两次。所有进程都是正常运行的进程,由操作系统单独调度。通常它们会同时运行。

    【讨论】:

    • 正确,它将独立于您的父进程运行
    【解决方案2】:

    查看 POSIX rationale for fork,尤其是这段文字:

    IEEE Std 1003.1-1988 忽略了要求同时执行 fork() 的父项和子项。单线程处理的系统显然不是预期的,并且被认为是本卷 POSIX.1-2008 的不可接受的“玩具实现”。对“独立执行”这一短语预期的唯一反对意见是可测试性,但这个断言应该是可测试的。此类测试要求父母和孩子都可以阻止对方的可检测操作,例如写入管道或信号。系统应该可以进行此类操作的交互式交换,以符合本卷 POSIX.1-2008 的意图。

    fork 的所有历史实现都提供了并发执行,这始终是本意。它在标准的现代版本中明确说明,如

    在 fork() 之后,父进程和子进程都应该能够在任一进程终止之前独立执行。

    【讨论】:

      【解决方案3】:

      例如,您应该看看man page。当你fork()时,创建的进程是相同的,你不知道它们是按什么顺序执行的。

      【讨论】:

        【解决方案4】:

        fork man page

        fork() 通过复制调用进程来创建一个新进程。 新进程,称为子进程,是 调用进程,称为父进程,除了 以下几点:

        新进程与父进程并行运行,两者在从fork() 调用返回后继续执行。

        【讨论】:

          【解决方案5】:

          恕我直言,您的代码是正确的:

           Upon successful completion, fork() returns a value of 0 to the child
           process and returns the process ID of the child process to the parent
           process.  Otherwise, a value of -1 is returned to the parent process, no
           child process is created, and the global variable errno is set to indi-
           cate the error.
          

          但可能它并没有达到您的预期,如果所有分叉都成功,它会创建 2^num_fork_loops子进程返回 0,父进程返回 PID(始终为正),因此在这种情况下,子进程也将开始创建其他进程。
          通过使子进程执行其他操作来更正代码(除非您想要 2^N 个进程):

          for(j = 0; j < num_fork_loops;j++) {
             pid_t pid=fork();
             if (pid < 0) 
             {
                printf("Fork has failed\n");
                exit(EXIT_FAILURE);
             }
             else if(pid==0)
             {
                 j=num_fork_loops; // avoid to continue the loop for the child
                 child_routine();
             }
             else
             {
                 // This is the father, in case of success of the fork
                 j++;
             }
           }
          

          【讨论】:

          • 对不起,我应该解释得更清楚,这个想法是测试操作系统调度程序(通过创建多个进程)并对其进行更改,所以 2^n 进程很棒。我想知道如何做到这一点,所以谢谢:-)
          猜你喜欢
          • 2014-02-14
          • 2018-10-20
          • 2021-05-11
          • 1970-01-01
          • 2018-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多