【问题标题】:How many process are created by the program?程序创建了多少进程?
【发布时间】:2021-03-25 21:56:58
【问题描述】:

程序创建了多少进程,包括 初始父进程?还有“Hello”会打印多少次?

我认为,因为它是 4 个分叉 16 个进程(使用 2^n),并且父进程添加到 16 个进程 = 17。 (不确定)

下面是我的代码:


#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(){
    
    int i;
    for(i=0; i<3; i++){
        
        if(fork());
        printf("Hello %d\n", getpid());
        
    }
    return 0;
    
}

【问题讨论】:

  • 运行时会发生什么?
  • @JJF 打印出 Hello 13 次,并打印 getpid() 号码。
  • 你看到了多少个独特的 pid?这就是你问题的答案,现在你只需要弄清楚为什么。
  • @NateEldredge 有 8 个唯一的 pid,有没有办法通过绘制进程树来解释这一点?
  • 其实我觉得代码不正确是因为if(fork())后面多了一个分号(;)。此外,我认为您应该寻找的条件是“if (!fork())”,以便打印仅针对创建的子节点而不是父节点执行。还要重新检查您认为循环正在执行的次数。

标签: c linux fork child-process


【解决方案1】:

我运行它,它打印了 14 次“Hello”。

我认为解决这个问题的最好方法是倒退。 当i = 2(循环的最后一次迭代)时,将打印出两个“Hello”——一个是父级,一个是子级。

i = 1 时,父母和孩子将各自打印一次“Hello”,然后他们每个人都将继续到i = 2 的下一次迭代(在这种情况下,我们看到有 2 次打印) .所以,我们总共有 2+2+2=6 次“Hello”的打印。

i = 0 时,父母和孩子将各自打印一次“Hello”,然后他们每个人都将继续到i = 1 的下一个迭代(在这种情况下,我们看到有 6 个打印) .所以,我们总共有 2+6+6=14 个“Hello”的打印。

这可能可以通过一些公式来概括(并通过归纳证明)。

【讨论】:

  • 你也得到了 8 个进程吗?
  • @learning 是的,打印了 8 个不同的进程 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2014-06-22
  • 2021-07-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多