#include <unistd.h>
int main()
{
fork();
fork() && fork() || fork();
fork();
printf(“forked\n”);
return 0;
}
请帮我理解这个程序。为什么要打印20次?
答案 0 :(得分:1)
现在请记住,每个fork()
调用都会导致创建一个新进程,并且一个进程中的返回值为0,另一个进程中的正值(pid,但这与此无关)。所以如果你有代码
fork(); fork(); fork();
你最终得到8个进程。原始的一个,由第一个fork创建的子,然后是这两个,由第二个fork(现在总共4个)创建的子,然后对于所有这四个,由第3个fork创建的另一个子。
然后考虑代码的澄清版本:
#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
。如果你想要大脑练习,用调试器做这件事,你可以在脑海中完成这项任务(使用纸和笔来帮助),这要归功于所有的问题。
答案 1 :(得分:1)
每个fork基本上都会导致两个进程。
在表达式fork() && fork() || fork();
中,不会执行每个fork()
调用。
fork()
调用在调用者进程中返回che子级的PID,并在新子进程中返回0。
如果在任何进程A中执行此行,则第一行将导致一个新进程B.该进程在两个进程中继续。第二个将在A中执行,但不在B中执行。因此A获得一个新的孩子C.第三个在B和C中执行,但不在A中执行,导致D和E.
所以我们为这一行获得了5个进程。
这一行在2个进程中执行,因为单行上的前一个fork();
会导致它们。
现在我们有10个进程,每个进程执行最后的fork();
,以便我们获得20个进程。
而不是
printf("forked\n");
你可以做到
printf("forked %d <- %d\n", getpid(), getppid());
查看流程之间的关系。
答案 2 :(得分:0)
参考:
http://www.geeksforgeeks.org/fork-and-binary-tree/
请记住, - fork()在子进程中返回0,在父进程中返回非零(子进程PID)。条件运算符是简写。