Operating system fork()在这里如何工作? { if(fork()&&fork()) { 叉子() } if(fork()| | fork()) { 叉子() } printf(“你好”); 返回0; }

Operating system fork()在这里如何工作? { if(fork()&&fork()) { 叉子() } if(fork()| | fork()) { 叉子() } printf(“你好”); 返回0; },operating-system,fork,parent-child,Operating System,Fork,Parent Child,我不知道fork()在这里会有什么表现,也不知道会打印多少次hello。 我只知道,fork()&&fork()将为一个父级生成总共3个进程,同样,fork()| fork()将为一个父级生成3个进程 在第一个if条件之后,将创建3个进程,并且只有父进程将进入if块。现在总共有4个进程。现在,如何进一步,我完全被这搞砸了 如果可能,请显示树形图。第一个区块: if(fork() && fork()) { fork(); } 子进程接收0并跳过if,父进程继续计算条

我不知道
fork()
在这里会有什么表现,也不知道会打印多少次hello
我只知道,
fork()&&fork()
将为一个父级生成总共3个进程,同样,
fork()| fork()
将为一个父级生成3个进程

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

如果可能,请显示树形图。第一个区块:

if(fork() && fork()) 
{ 
    fork(); 
}
子进程接收0并跳过if,父进程继续计算条件。父级执行下一个fork并进入if块,在那里再次fork。因此,我们有3个fork调用,导致4个进程

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

if(fork() || fork()) 
{
    fork();
} 
我们用叉子叉一次。子级接收到非0且条件结果已经为true,因此它进入if而不计算条件的第二部分并在那里分叉。我们已经有了两个fork调用。父进程必须计算表达式中的第二个fork,它的子进程再次输入if和fork。所以还有两个fork调用。总共4次调用,导致5个正在运行的进程


因此,从第一个块到第二个块的4个进程中的每一个都分叉到5个进程,结果总共是4*5=20个进程。每个人都会打印“你好”

树可视化

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

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

并且每个将执行下一个if块

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


总的来说,我们将在系统中运行4*5=20进程,每个进程将打印“Hello”。

使用调试器运行您的程序。还可以使用-可能与
-f
选项一起使用-来理解所涉及的系统调用。顺便说一句,你的问题看起来像是家庭作业。因此,请仔细阅读BTW的相关章节,将
printf
语句更改为
printf(“hello in%d parent%d\n”,(int)getpid(),(int)getppid())应该非常有用。并添加一个
printf(“启动pid%d\n”,getpid())应该会有很大帮助。最后,你应该始终将
fork
的结果显式地保存在某个局部变量中,并且你应该测试
fork
以防失败。你能详细说明第二部分吗?你真的应该自己尝试这样做。请记住,逻辑表达式是惰性计算的。谢谢!我用一个树形方法将其可视化。
然后孩子继续计算条件是否是收到“0”的孩子,并且跳过了计算?它是将执行next fork()的父级@amaneureka,谢谢你的更正。我已经确定了答案。