我在这个程序上遇到了一些麻烦。我知道fork()函数的作用。它用于从现有流程创建新流程。新进程称为子进程,现有进程称为父进程。父母返回孩子的pid并且孩子返回0.也就是说,我发现很难理解这两个fork函数在这个程序中做了什么。
#include <unistd.h>
#include <stdio.h>
int main()
{
int i,y,x=1;
for (i=0;i<4;i++)
if(x && fork())
{
y = i;
x = 0;
}
if (x) y = i;
fork();
printf("%i\n",y);
}
答案 0 :(得分:1)
首先声明:fork不会失败。这不是真的,但更简单
if(x&amp;&amp; fork()) - &GT;如果x == 1并且fork返回父亲,则为true 然后是假的。 所以孩子也会创造一个孩子(除了最后一个孩子),但是 父亲只是创造了一个孩子。
在循环之后,你有1 + 4个新进程。 这5个进程执行最后一个fork(),你有10个进程。
由于任务的安排,输出结果不确定。
答案 1 :(得分:0)
原始流程在进入循环if
时会打开一个流程。自if
以来,孩子未输入fork() == 0
。现在,父级已x == 0
,并且不再进入以下迭代'if
s(短路&&
阻止fork
s。)
注意:短路if(x && fork())
可防止因x == 0
=&gt;而分叉两次无需评估fork()
(对于分叉一次的所有进程都为true)。分叉的进程永远不会进入循环if
,因为x == 0
从那一点开始。
你得到的是每个循环值两次,因为每个新进程在打印之前分别进行下一次迭代和循环之外。循环中的每个衍生过程都没有第一个以外的叉子。
#include <unistd.h>
#include <stdio.h>
int main()
{
int i,y,x=1;
for (i=0;i<4;i++)
if(x && fork()) // only un-forked process (x=1) executes fork()
{
// only parent process (fork() != 0) execute this
y = i;
x = 0;
}
if (x) y = i; // set up i=4 for last forked process (has x=1)
fork();
printf("%i\n",y);
}
流程产生过程看起来像这样:
提示:在调查此类代码时,您可以添加输出语句(printf
)或使用调试器。
答案 2 :(得分:0)
实际上你可以从这个程序中学到一些东西,当你看到叉子返回的pid并从中估计出来时,哪个fork会产生什么输出:
#include <unistd.h>
#include <stdio.h>
int main()
{
int i,y,x=1;
pid_t p,c;
for (i=0;i<4;i++)
if(x && 0 != (p=fork()))
{
y = i;
c = p;
x = 0;
}
if (x) y = i;
p=fork();
printf("%i %d %d\n",y, p, c);
}
例如,我得到了这个输出:
0 24413 24412
0 0 24412
2 24417 24416
1 24415 24414
1 0 24414
3 24419 24418
2 0 24416
3 0 24418
4 24420 0
4 0 0
第一行是第一个孩子的孩子,下一行是第一个孩子本身,依此类推。最后一行是父母。
仔细考虑,你可以了解fork是如何工作的。
呃,对不起,我完全错了,差不多:fork给父母带来了正面的pid,当然不是给孩子。因此,具有正p和c的每一行都是父,依此类推。我让其他人为你解决。