fork() 在这里如何工作?
How fork() will work here?
{
if(fork() && fork())
{
fork();
}
if(fork() || fork())
{
fork();
}
printf("hello");
return 0;
}
我不知道 fork()
在这里会如何表现,以及 hello 会打印多少次。
我只知道 fork() && fork()
将为 1 个父进程生成总共 3 个进程,类似地,fork() || fork()
将为 1 个父进程生成 3 个进程。
在第一个 if
条件之后,创建了 3 个进程,只有父进程会进入 if 块。现在总共有 4 个进程。现在,如何进一步进行,我完全搞砸了?
如果可能,请给出树状图。
第一个区块:
if(fork() && fork())
{
fork();
}
Child进程收到0,跳过if,parent继续计算条件。 Parent 执行下一个 fork 并进入再次 fork 的 if 块。所以我们有 3 个 fork 调用导致 4 个进程。
然后这4个进程中的每一个都执行下一个块。单看一个:
if(fork() || fork())
{
fork();
}
我们分叉一次。 child 收到非 0 且条件结果已经为真,因此它进入 if 而不评估条件的第二部分并在那里分叉。所以我们已经有 2 个 fork 调用。 Parent 进程必须计算表达式中的第二个分叉,它 child 进入 if 并再次分叉。所以还有 2 个 fork 调用。总共 4 个调用导致 5 个 运行 个进程。
所以来自第一个块的 4 个进程中的每一个在第二个块中分叉 in-to 5 个进程,导致总共 4*5 = 20 个进程。每个打印 "hello".
树可视化!
if(fork() && fork())
{
fork();
}
现在系统中有4个进程运行; P、C1、C2 和 C3.
如果块,每个将执行下一个。
if(fork() || fork())
{
fork();
}
系统中总共有 4*5 = 20 个进程 运行,每个进程都会打印 "Hello".
{
if(fork() && fork())
{
fork();
}
if(fork() || fork())
{
fork();
}
printf("hello");
return 0;
}
我不知道 fork()
在这里会如何表现,以及 hello 会打印多少次。
我只知道 fork() && fork()
将为 1 个父进程生成总共 3 个进程,类似地,fork() || fork()
将为 1 个父进程生成 3 个进程。
在第一个 if
条件之后,创建了 3 个进程,只有父进程会进入 if 块。现在总共有 4 个进程。现在,如何进一步进行,我完全搞砸了?
如果可能,请给出树状图。
第一个区块:
if(fork() && fork())
{
fork();
}
Child进程收到0,跳过if,parent继续计算条件。 Parent 执行下一个 fork 并进入再次 fork 的 if 块。所以我们有 3 个 fork 调用导致 4 个进程。
然后这4个进程中的每一个都执行下一个块。单看一个:
if(fork() || fork())
{
fork();
}
我们分叉一次。 child 收到非 0 且条件结果已经为真,因此它进入 if 而不评估条件的第二部分并在那里分叉。所以我们已经有 2 个 fork 调用。 Parent 进程必须计算表达式中的第二个分叉,它 child 进入 if 并再次分叉。所以还有 2 个 fork 调用。总共 4 个调用导致 5 个 运行 个进程。
所以来自第一个块的 4 个进程中的每一个在第二个块中分叉 in-to 5 个进程,导致总共 4*5 = 20 个进程。每个打印 "hello".
树可视化!
if(fork() && fork())
{
fork();
}
现在系统中有4个进程运行; P、C1、C2 和 C3.
如果块,每个将执行下一个。
if(fork() || fork())
{
fork();
}
系统中总共有 4*5 = 20 个进程 运行,每个进程都会打印 "Hello".