fork()调用的输出

时间:2012-10-14 09:56:21

标签: fork

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

func(){
fork();
fork();
fork() && fork() || fork();
fork();
print("Saikacollection\n");
}

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

3 个答案:

答案 0 :(得分:16)

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

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

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

enter image description here

考虑显示的图像: -

约定:流程的所有父母(来电者)都会写入left并标有star

fork()
  • 一开始,我们只有一个进程,因此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的两个操作数中||truewe don't check the second操作数。
  • 考虑一下,fork()调用1(标记)节点,创建两个进程。当父对象得到一个正数(pid)作为返回时,child得到一个0.所以,父对象执行第二个运算符,而子对象在||之后跳转到fork()如图所示。
  • 为第4级父级执行&&fork(),返回一个进程的pid,该进程终止,而该步骤的子进程为0。因此,它将执行{{1} }
  • 对5级孩子的最终||fork()调用,进一步产生了一个过程
  • 因此,在步骤结束时,我们有5个叶子(进程),如图中的下划线所示。
  • 如果我们对所有三个节点都做了同样的事情,我们就可以有||fork()个进程。

    5*4 = 20

  • 最后一分叉()只是fork()该步骤可用的流程数。

  • 因此,进程总数= doubles

答案 1 :(得分:1)

Saikacollection每次都会在新行中打印32次。

答案 2 :(得分:0)

如果你想让新进程更加独立,你可以看看exec- *函数系列(POSIX) - 所以你可以fork,然后立即替换fork进程(你可以这样做,因为新分叉过程由你控制);或者也可以看看popen()。