任何人都可以帮助我理解这将如何创建过程吗?
Main()
{
Fork();
Fork() && fork () || fork ();
Fork ();
}
答案 0 :(得分:3)
尝试绘制流程创建树并研究/记住以下几点:
P1。 fork()
将pid(更大的tan 0)返回到当前进程
并在子进程中返回0
P2。你将需要知道如何
表达式A() && B() || C()
被评估;例如,如果A()
返回
由于0 (false)
是B
,因此0 && whatever
函数0
不会被评估
始终Main()
{
Fork() /*[1]*/;
Fork() /*[2]*/ && fork ()/*[3]*/ || fork ()/*[4]*/;
Fork ()/*[5]*/;
}
。
现在,让我们将调用标记为易于参考:
[0]
/ / \ \
[1] [2] [3] [5]
/ | \
[2] [3] [5]
我将绘制第一级创建过程(以及一些第二级):
fork()
上面的树意味着进程[0](初始进程)将执行编号为1,2,3和5的process [0]
函数。为什么没有fork()[4]
运行fork()[2] && fork[3]
?由于fork()[4]
已经评估为true,因此无法评估fork[1]
。
将类似的概念应用于第二级fork[4]
分叉的进程,以查看未调用进程{{1}}的原因。
您可以通过在流程创建树的每个级别应用P1和P2来完成流程创建树。
答案 1 :(得分:1)
请记住,fork有一个返回值,0或PID(无法记住子节点是获取PID还是父节点)。所以&&和||返回PID时,运算符将评估为true,在这种情况下,将分叉更多进程。希望有所帮助