fork()调用的输出

Pra*_*ngh 1 fork

以下fork()调用的输出是什么?

func(){
fork();
fork();
fork() && fork() || fork();
fork();
print("Saikacollection\n");
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我获得此代码的答案以及一些解释,因为我是操作系统的新手?我在SO上找到了关于fork()的几个问题,但是不知道多少.

Pra*_*ngh 16

Saikacollection将打印40时间作为代码的输出.这可以解释如下: -

要了解输出,我们需要了解以下内容: -

  • 成功执行fork()调用后,将创建新的子级.创建子进程的过程被调用parent process.
  • Fork()调用将pid子项返回(进程标识符)为父级
  • Fork()返回0子进程.

在此输入图像描述

考虑一下显示的图像: -

惯例:该过程的所有父母(呼叫者)都被写入left并标记为star.

fork()
Run Code Online (Sandbox Code Playgroud)
  • 一开始,我们只有一个进程,因此fork()调用会创建一个子进程.考虑树的根作为级别1,我们可以在级别2看到,我们有两个进程,父进程(左)和子进程(右).

    fork()

  • fork()再次进一步创建了4这样的进程,标记为1,2,3,4.由于所有四个进程都将进一步通过类似的代码结构,我们可以说进程总数将是4单个进程生成的时间

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

  • 理解这个陈述涉及到,实现了在C中的事实, && operator has more precedence than ||

  • 另外,如果first两个操作数的加入了&&wrong,我们don't check the second.同样,如果first两个操作数的||就是true,we don't check the second操作数.
  • 考虑在1(标记)节点处调用fork(),创建两个进程.当父对象得到一个正数(pid)作为返回时,child得到一个0.所以,父对象执行第二个运算符,而子对象在||之后跳转到fork()如图中标记的那样.
  • &&fork()对于父级在第4级的执行,返回一个进程的pid,该进程终止,而该步骤的子进程为0.因此,它将执行||fork()
  • ||fork()5级孩子的最后调用,进一步产生了一个过程
  • 因此,在步骤结束时,我们有5个叶子(进程),如图中的下划线所示.
  • 如果我们对所有三个节点都做了同样的事情,我们就可以获得5*4 = 20进程.

    fork()

  • 最终fork()只是doubles该步骤可用的进程数.

  • 所以,进程总数= 2*20 = 40.