【问题标题】:Output of fork() callsfork() 调用的输出
【发布时间】:2012-10-04 13:41:14
【问题描述】:

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

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

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

【问题讨论】:

  • 有一天,我要制作一个输出“停止疯狂!!”的操作系统并在发生 4 次分叉且中间没有任何处理时死亡。
  • 这不是一个实际的例子,只是一个面试问题来检查理解
  • 输出是很多进程
  • @nneonneo 你能详细说明一下吗?这将如何发生?
  • @cHao:OS X 在这方面做得很好; forkbombs 通常会遇到“资源暂时不可用”。

标签: fork


【解决方案1】:

Saikacollection 每次换行打印 32 次。

【讨论】:

  • 假设操作系统在进程之间同步对标准输出的访问。如果没有,您可能会以“SSSSSSSSSSaaaaSaaaaaiSaaaaaiiSSS...”结束。
  • 你能解释一下吗?
  • @user1747039 不应该是 40 而不是 32。我认为你在某处犯了错误
【解决方案2】:

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

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

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

考虑显示的图像:-

约定:进程的所有父母(调用者)都写入left,并标有star

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

    fork()

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

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

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

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

    fork()

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

  • 因此,进程总数 = 2*20 = 40

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2012-01-12
      • 2019-07-17
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      相关资源
      最近更新 更多