2

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

这是我用来 fork() 的代码

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

谢谢你的时间

4

5 回答 5

5

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

于 2012-11-13T22:18:25.440 回答
1

请参阅 POSIX基本原理fork,尤其是以下文本:

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

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

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

于 2012-11-13T23:28:25.020 回答
0

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

 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。如果分叉失败,它会返回 -1 并且您检查返回值是正确的,但如果成功,它会返回 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++;
   }
 }
于 2012-11-13T22:28:16.717 回答
0

例如,您应该只看一下手册页。当您fork()创建的流程相同时,您不知道它们的执行顺序。

于 2012-11-13T22:19:09.713 回答
0

请参阅fork 手册页

fork() 通过复制调用进程来创建一个新进程。新进程(称为子进程)与调用进程(称为父进程)完全相同,但以下几点除外:

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

于 2012-11-13T22:20:23.857 回答