1

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

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

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

4

3 回答 3

16

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

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

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

在此处输入图像描述

考虑显示的图像:-

约定:该过程的所有父母(调用者)都被写入left并标有star.

fork()
  • 一开始,我们只有 1 个进程,因此 fork() 调用会创建一个子进程。将树的根视为第 1 级,我们可以看到在第 2 级,我们有两个进程,父进程(左)和子进程(右)。

    fork()

  • fork() 再次进一步创建4这样的进程,标记为 1、2、3、4。由于所有四个进程都将进一步经历相似的代码结构,我们可以说进程总数将是4单个进程产生的次数

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

  • 理解这个陈述涉及,意识到在 C 中,&& operator has more precedence than ||

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

    fork()

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

  • 因此,进程总数 = 2*20 = 40.
于 2012-11-03T01:47:41.733 回答
1

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

于 2012-10-15T12:15:15.997 回答
0

如果您希望新进程更加独立,您可以查看 exec-* 系列函数(POSIX) - 这样您就可以分叉,然后立即替换分叉进程(您可以这样做,因为新分叉的进程受到控制由你); 或者也可以看看 popen() 。

于 2016-09-21T06:37:57.403 回答