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个进程在系统中运行P,C1,C2和C3
并且每个将执行下一个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,谢谢你的更正。我已经确定了答案。