【问题标题】:How fork() will work here?fork() 将如何在这里工作?
【发布时间】:2017-01-28 09:11:45
【问题描述】:
{ 
    if(fork() && fork()) 
    { 
        fork(); 
    } 

    if(fork() || fork()) 
    {
        fork();
    } 

    printf("hello"); 
    return 0; 
} 

我不知道 fork() 在此处的行为方式以及 hello 将被打印多少次。
我只知道fork() && fork() 将为 1 个父进程生成总共 3 个进程,同样,fork() || fork() 将为 1 个父进程生成 3 个进程。

在第一个 if 条件之后,创建了 3 个进程,只有父进程会进入 if 块。现在总共有 4 个进程。现在,如何进一步进行,我完全搞砸了?

如果可能,请展示一个树形图。

【问题讨论】:

  • 使用调试器运行您的程序。并且还可以使用strace(1) - 可能与-f 选项一起使用 - 以了解所涉及的系统调用。顺便说一句,你的问题看起来像一个家庭作业。所以仔细阅读fork (system call)然后是advancedlinuxprogramming.com的相关章节
  • 顺便说一句,将printf 语句更改为printf("hello in %d parent %d\n", (int)getpid(), (int)getppid()); 应该很有帮助。在程序开头添加printf("start pid %d\n", getpid()); 应该会有很大帮助。
  • 最后,您应该始终将fork 的结果明确地保存在某个局部变量中,并且您应该测试fork 是否失败。

标签: operating-system fork parent-child


【解决方案1】:

对于第一个区块:

if(fork() && fork()) 
{ 
    fork(); 
}

子进程收到0并跳过if,父进程继续计算条件。 Parent 执行下一个 fork 并进入它再次分叉的 if 块。所以我们有 3 个 fork 调用导致 4 个进程。

然后这 4 个进程中的每一个都执行下一个块。我们来看一个:

if(fork() || fork()) 
{
    fork();
} 

我们分叉一次。孩子收到非 0 并且条件结果已经为真,因此它进入 if 而不评估条件的第二部分并在那里分叉。所以我们已经有 2 个 fork 调用了。父进程必须评估表达式中的第二个分叉,并且它的子进程进入 if 并再次分叉。所以还有 2 次分叉调用。总共 4 次调用,导致 5 个正在运行的进程。

因此,第一个块中的 4 个进程中的每一个都在第二个块中分叉为 5 个进程,总共有 4*5 = 20 个进程。并且每一个都打印“hello”。

【讨论】:

  • 你能详细说明第二部分吗?
  • 你真的应该尝试自己做。请记住,逻辑表达式是惰性求值的。
  • 谢谢!我通过树方法将其可视化。
  • and the child proceeds to calculate condition. 不就是孩子收到“0”,跳过计算吗?它将执行下一个 fork() 的父级;
  • @amaneureka,感谢您的指正。我已经确定了答案。
【解决方案2】:

树可视化!

if(fork() && fork()) 
{ 
    fork(); 
}

现在我们有 4 个进程在系统中运行; PC1C2C3

如果块,每个都会执行下一个。

if(fork() || fork()) 
{ 
    fork(); 
}

我们总共将有 4*5 = 20 个进程在系统中运行,每个进程都会打印“Hello”。

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 1970-01-01
    • 2023-04-11
    • 2013-08-04
    • 2015-06-08
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多