#include <unistd.h>
int main()
{
fork();
fork() && fork() || fork();
fork();
printf(“forked\n”);
return 0;
}
请帮助我理解这个程序。为什么要打印20次?
#include <unistd.h>
int main()
{
fork();
fork() && fork() || fork();
fork();
printf(“forked\n”);
return 0;
}
请帮助我理解这个程序。为什么要打印20次?
现在请记住,每次fork()
调用都会创建一个新进程,并且一个进程的返回值为 0,而另一个进程的返回值为正值(pid,但这在这里无关紧要)。所以如果你有代码
fork(); fork(); fork();
你最终有 8 个进程。原始一个,第一个叉子创建的孩子,然后对于这两个,第二个叉子创建一个孩子(现在总共 4 个),然后对于所有 4 个,第三个叉子创建一个孩子。
然后考虑代码的澄清版本:
#include <unistd.h>
#include <stdbool.h> // to have bool type for correct code
int main()
{
fork();
// (fork() && fork()) || fork() opened up
{
bool tmp = fork(); // 0 implicitly cast to false, nonzero to true
if (tmp) {
tmp = fork();
}
if (!tmp) {
tmp = fork();
}
}
fork();
printf(“forked\n”);
return 0;
}
所以这加起来会产生 20 个进程,每个进程最终都会到达printf
. 确切地说,如果你想要大脑练习,你可以在头脑中完成它(使用纸和笔来帮助),由于所有的叉子,使用调试器进行练习是徒劳的。
本质上,每个分叉都会导致两个进程。
在表达式fork() && fork() || fork();
中,并不是每个fork()
调用都被执行。
调用在fork()
调用者进程中返回,PID 为 che child,在新子进程中返回 0。
如果在任何进程 A 中执行此行,则第一个会导致一个新进程 B。该行在两个进程中都继续。第二个将在 A 中执行,但不在 B 中。因此 A 得到一个新的孩子 C。第三个在 B 和 C 中执行,但不在 A 中执行,导致 D 和 E。
所以我们得到这条线的 5 个进程。
此行在 2 个进程中执行,因为前面fork();
的单行导致它们。
现在我们有 10 个进程,每个进程都执行 final fork();
,这样我们就得到了 20 个进程。
代替
printf("forked\n");
你可以做
printf("forked %d <- %d\n", getpid(), getppid());
查看进程之间的关系。
参考这个:
http://www.geeksforgeeks.org/fork-and-binary-tree/
想法是记住 - fork() 在子进程中返回 0,在父进程中返回非零(子进程 PID)。条件运算符是简写。