fork() 函数在这个程序中是如何工作的?
How fork() function works in this program?
我在使用这个程序时遇到了一些问题。我知道 fork() 函数的作用。它用于从现有流程创建新流程。新进程称为 child 进程,现有进程称为 parent。 parent 返回 child 的 pid 而 child returns 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);
}
原进程在进入循环的if
时开辟一个进程。 child 没有进入 if
因为 fork() == 0
。现在parent有x == 0
,不再进入后面的迭代'if
s(短路&&
防止fork
s)。
注意: 短路 if(x && fork())
防止分叉两次,因为 x == 0
=> 不需要评估 fork()
(对所有进程都是如此分叉一次)。分叉一次的进程永远不会进入循环的 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
) 或使用调试器。
首先声明:fork 不会失败。那不是真的,而是更简单
if (x && fork())
-> 如果 x == 1 且 fork return 为父亲则为真
然后是假的。
所以 child 也会创建一个 child (除了最后一个)但是
父亲刚刚创造了一个 child.
循环后你有 1 + 4 个新进程。
这 5 个进程执行最后一个 fork(),你有 10 个进程。
由于任务的调度,输出结果是不确定的。
实际上你可以从这个程序中学到一些东西,当你查看分叉的 pids return 并据此估计,哪个分叉产生什么输出:
#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
第一行是第一个child的child,下一行是第一个child本身,依此类推。最后一行是 parent.
想一想,您就可以了解 fork 的工作原理。
错误,抱歉,我完全错了,几乎:将 return 的正 pid 分叉到 parent,当然不是 child。所以 p 和 c 为正的每一行都是 parent 等等。剩下的就交给你了。
我在使用这个程序时遇到了一些问题。我知道 fork() 函数的作用。它用于从现有流程创建新流程。新进程称为 child 进程,现有进程称为 parent。 parent 返回 child 的 pid 而 child returns 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);
}
原进程在进入循环的if
时开辟一个进程。 child 没有进入 if
因为 fork() == 0
。现在parent有x == 0
,不再进入后面的迭代'if
s(短路&&
防止fork
s)。
注意: 短路 if(x && fork())
防止分叉两次,因为 x == 0
=> 不需要评估 fork()
(对所有进程都是如此分叉一次)。分叉一次的进程永远不会进入循环的 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
) 或使用调试器。
首先声明:fork 不会失败。那不是真的,而是更简单
if (x && fork()) -> 如果 x == 1 且 fork return 为父亲则为真 然后是假的。 所以 child 也会创建一个 child (除了最后一个)但是 父亲刚刚创造了一个 child.
循环后你有 1 + 4 个新进程。 这 5 个进程执行最后一个 fork(),你有 10 个进程。
由于任务的调度,输出结果是不确定的。
实际上你可以从这个程序中学到一些东西,当你查看分叉的 pids return 并据此估计,哪个分叉产生什么输出:
#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
第一行是第一个child的child,下一行是第一个child本身,依此类推。最后一行是 parent.
想一想,您就可以了解 fork 的工作原理。
错误,抱歉,我完全错了,几乎:将 return 的正 pid 分叉到 parent,当然不是 child。所以 p 和 c 为正的每一行都是 parent 等等。剩下的就交给你了。