【问题标题】:How many processes would be created from fork() in this code?在这段代码中,fork() 会创建多少个进程?
【发布时间】:2020-09-12 18:31:06
【问题描述】:

这是我的一项任务中提出的问题,我对此有些困惑。

int main() 
{ 
  printf("line\n");
  pid_t pid = fork();
  fork();
  fork();
  if(pid == 0)
    fork();

  fork();
  printf("line\n");
  return 0; 
} 

执行代码会创建多少进程?

从执行代码开始,它会生成 28 行输出,只是不确定如何找到在此语句中创建的进程数量。

【问题讨论】:

  • 最后,它会产生 24 个进程。所以我想它会产生 25 行。

标签: c multithreading process fork


【解决方案1】:

如上,24个叶子产生。所以24个进程最终产生。在你的第一个叉子之前,“line”将被打印一次。在fork 之后,由于有 24 个进程,将打印 24 个“行”。所以你将有 25 条“线”。

【讨论】:

  • 这是一个很好的解释 :) 谢谢。
【解决方案2】:

总共将有 24 个进程。方法如下。

在第一个 fork() 之后有两个进程。其中之一pid == 0;在另一个进程中pid != 0

第二次fork后有4个进程(其中一半有pid == 0)。

第三次fork后有8个进程(其中一半有pid == 0)。

第四个 fork 语句仅由 pid == 0 所在的那些进程执行。所以4个进程会执行fork(变成8个进程)。其他 4 个进程不会执行 fork,将保持 4 个。我们总共有 8+4=12 个进程。

最后,另一个分叉将我们的 12 个进程变成了 24 个。

执行代码会创建多少线程?

现在是语义问题。你说进程不是线程,所以创建0个线程?你说24个进程中,第一个是原始进程,不是这段代码创建的,所以一共创建了23个进程?这是语义问题,而不是软件问题,因此我们无法帮助您。

打印行数

第一个 printf 仅由原始进程执行(因为它还没有分叉)。第二个 printf 由所有 24 个进程执行(就在每个进程终止之前)。所以一共打印了 25 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2014-02-03
    • 2017-02-25
    • 1970-01-01
    • 2014-03-23
    • 2021-01-18
    相关资源
    最近更新 更多