为什么该程序打印“分叉!” 4次?

为什么该程序打印“分叉!” 4次?


#include <stdio.h>

#include <unistd.h>


int main(void) {


  fork() && (fork() || fork());


  printf("forked!\n");

  return 0;

}


四季花海
浏览 525回答 3
3回答

湖上湖

第fork()一个在调用过程中返回一个非零值(称为p0),在子进程中返回0(称为p1)。在p1中,发生短路,&&然后过程调用printf并终止。在p0中,过程必须评估表达式的其余部分。然后fork()再次调用,从而创建一个新的子进程(p2)。在p0中,fork()返回一个非零值,并进行短路||,因此该过程调用printf并终止。在p2中,fork()返回0,所以||的其余部分&nbsp;必须评估,这是最后一个fork();导致为p2创建一个孩子(称为p3)。然后printf,P2执行并终止。然后printf,P3执行并终止。printf然后执行4&nbsp;s。

婷婷同学_

对于所有反对者来说,这是一个合并但又不同的问题。怪SO。谢谢。您可以将问题分解为三行,第一行和最后一行都只是使过程数加倍。fork() && fork() || fork();操作员正在短路,所以这是您得到的:&nbsp; &nbsp; &nbsp; &nbsp;fork()&nbsp; &nbsp; &nbsp; /&nbsp; &nbsp; &nbsp; \&nbsp; &nbsp; 0/&nbsp; &nbsp; &nbsp; &nbsp; \>0&nbsp;|| fork()&nbsp; &nbsp; &nbsp;&& fork()&nbsp; &nbsp; &nbsp;/\&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /&nbsp; &nbsp;\&nbsp; &nbsp; /&nbsp; \&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0/&nbsp; &nbsp; &nbsp;\>0&nbsp; &nbsp;*&nbsp; &nbsp; *&nbsp; &nbsp; &nbsp;|| fork()&nbsp; *&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /&nbsp; &nbsp;\&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp;*所以这总共4 * 5 = 20处理每行打印一行。注意:如果fork()由于某种原因失败(例如,您对进程数有一定限制),它将返回-1,然后您将获得不同的结果。
打开App,查看更多内容
随时随地看视频慕课网APP