谁在fork()之后首先执行:parent还是child?

我知道这可以是其中之一。 但是我总是看到孩子首先在我的UNIXterminal上执行。 另外,为什么父母和孩子不能同时执行。 他们似乎正在连续执行。 这是因为他们共享相同的terminal?

一般来说,关于执行的相对顺序,没有什么可说的。

现在,让我们考虑一下你的具体问题。 如果:

  1. 两个进程都需要花费不少的时间来运行
  2. 你是说在另一个取得进展之前一个完成
  3. 有没有使用的CPU周期,和
  4. 每次运行应用程序时都会发生这种情况。

这很可能表明这两个进程之间存在一些(可能是无意的)同步。

实际上,即使目前没有运作,这也是意图的行为,这意味着父母可以在孩子面前跑,而孩子可以在父母面前跑。

目标是首先运行子进程。

简而言之,逻辑背后的逻辑是,如果孩子先跑,那么如果孩子正在调用exec则写入时副本(COW)的开销将被消除,因为父母没有机会写入地址空间。

如果你正在调用vfork,那么几乎所有的实现都定义了这个子节点将会先运行,然后父节点将会被执行(直到子节点调用exec),所以在vfork的情况下你将会注意到串行执行,而不管它是否是schedular。但是,两个新的进程被创建。它们可以自由运行(就像任何其他进程一样)。 首先运行哪个进程将严重依赖于调度算法。 除了调度算法之外,当时运行的进程的数量也决定了输出的性质。而且,如果你使用标准库I / O函数,它们以突发方式输出数据(可能不是正确的单词)。 这也将在一定程度上决定谁先写作。 这是一个示例代码(这实际上没有多大意义,但仍然是父母和孩子确实同步运行的一个很好的例子

  #include<stdio.h> #include<string.h> static void charAtTime(char buff[]) { char *p=buff; while(*p) { putc(*p,stdout); (p++); } } int main() { setbuf(stdout,NULL); //set output stream to be unbuffered.Now each process will try to throw chars as soon as they are ready int pid; char buff[1000]; if((pid=fork())<0) //First fork { fprintf(stderr,"Fork error\n"); } else if(pid==0) { strcpy(buff,"i am the child.I love beyblade.I love anime.I love pokemon\n"); charAtTime(buff); } else { int pid2=fork(); //secnd fork if(pid2==0){ strcpy(buff,"I am the younger child\n"); charAtTime(buff); } else { int pid3; pid3=fork(); //third fork if(pid3==0) { strcpy(buff,"I am from the 2nd generation\n"); charAtTime(buff); } else { strcpy(buff,"Our family tree is bit confusing\n"); charAtTime(buff); } } strcpy(buff,"I am the big daddy of them.I have the right before them\n"); } return 0; } 

对于我的系统,下面的输出

  i am thOeI u ra cmfha mtihley yoIturne geea rmi cshf irblodimt thceo i2nnlfdd .uIg elnseoivrnea gb teiyobnl ade.I love anime.I love pokemon 

但是,如果将fork的数量减少到两个(只有两个进程竞争),那么输出就不那么难看了。它的父执行第一(可能是因为它的当前正在运行的进程创建其他进程时)

没有一个在另一个之前执行。 这只是父母将fork()然后wait()的孩子完成。 例如,如果您使用管道系列命令,它甚至可能会分叉几次。