UNIX中的Fork()是否创建了一致或顺序运行的进程?

时间:2012-11-13 22:16:17

标签: c process fork minix

当在类似Unix的操作系统(即MINIX 3)中运行的程序中使用fork()函数时,它会创建一些独立的进程,这些进程可以独立处理,因此可以相互提前完成(这是实际上我想要的东西)或者它会创建一系列顺序过程,只按照创建的顺序完成。

这是我用来fork()

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

感谢您的时间

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

请参阅POSIX rationale for fork,特别是此文字:

  

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

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

  

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

答案 2 :(得分:0)

您应该只看一下man page。当fork()创建的进程是同意的,并且您不知道它们的执行顺序。

答案 3 :(得分:0)

请参阅fork man page

  

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

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

答案 4 :(得分: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。如果fork失败则返回-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++;
   }
 }