无法理解fork()的保证

时间:2016-03-12 09:12:41

标签: c unix fork

我无法理解fork()之后是否有保证。在研究链式流程粉丝流程时,我陷入了困境。如果我分叉两次,层次结构大致是

enter image description here

它们是代码的条件:

  • (childpid = fork()) <= 0如果是孩子或错误,请将其打破。 (粉丝)
  • (childpid = fork()) > 0如果是父母,请打破它。 (链)

对于2个进程的粉丝,显示草图

enter image description here

对于2个过程的链,显示草图

enter image description here

所以我的堆叠点在这里是如何知道哪个父母会破坏?是否保证首先创建第一个父级(前1个)分叉,然后创建另一个父级(左侧1)?例如,风扇情况可以草图吗?为什么? 如果是,则在2个调用fork()的链中创建3个进程。谁是第三个?据我检查,它是孙子。但在这方面,在这种情况下,孙子女是在祖父母的孩子面前创建的。

enter image description here

simplechain.c

/* UNIX Systems Programming: Communication, Concurrency and Threads 2nd 
   Edition, Kay Robbins and Steven Robbins */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char *argv[]) {
   pid_t childpid = 0;
   int i, n;

   n = 2;
   for (i = 0; i < n; i++)
      if (childpid = fork())
         break;

   fprintf(stderr, "i:%d  process ID:%ld  parent ID:%ld  child ID:%ld\n",
           i, (long)getpid(), (long)getppid(), (long)childpid);
   return 0;
}

simplefan.c

/* UNIX Systems Programming: Communication, Concurrency and Threads 2nd 
   Edition, Kay Robbins and Steven Robbins */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char *argv[]) {
   pid_t childpid = 0;
   int i, n;

   n = 2;
   for (i = 0; i < n; i++)
      if ((childpid = fork()) <= 0)
         break;

   fprintf(stderr, "i:%d  process ID:%ld  parent ID:%ld  child ID:%ld\n",
           i, (long)getpid(), (long)getppid(), (long)childpid);
   return 0;
}

1 个答案:

答案 0 :(得分:0)

  

是否保证首先创建第一个父级(前1个)分叉,然后创建其他父级(左侧1)?例如,风扇情况可以草图吗?为什么呢?

第一个父母的孩子是第二个孩子的父母,所以有保证。在我出生之前,我的祖母生下了我的母亲,这是确定无疑的。

总共有3个进程。一个fork()调用有一个原始进程,它会创建一个子进程。

原始流程调用fork(); fork()在父级中返回非零子pid,因此for循环被破坏。它在子节点中返回0,表示循环继续,并立即计算i = 1。再次调用fork()并发生同样的事情:for循环被中断退出。在子进程中,在i++之后,i < n为false并且退出循环。总共fork()被调用了两次。已经有3个过程:原始过程,它的孩子和它的孙子。代码创建了 2