分叉for循环澄清

我已经在这里看到了很多关于for循环的例子,但是它没有做太多的说明。 让我们使用这个简单的例子来回答如何使用Fork()来创build只有2个subprocess? 举个例子。

for (i = 0; i < n; ++i) { pid = fork(); if (pid) { continue; } else if (pid == 0) { break; } else { printf("fork error\n"); exit(1); } } 

我见过的大多数例子都遵循这个通用格式。 但我不明白的是,这是如何防止subprocess分叉? 从我的理解来看,每个被创造的孩子也必须经历这个循环。 但fork()在for循环的最开始被调用,然后进行3次比较。 有人可以解释,即使孩子们似乎调用fork(),这个for循环仍然只能确保父母可以创build孩子吗?

小孩在fork后面开始。 fork为孩子返回0 。 在你的例子中,孩子会进入pid == 0块,并break for循环。

fork之后,子和父的所有内容都是完全相同的(包括下一条要执行的指令和变量值​​)。 唯一的区别是来自fork的返回值( 0代表孩子,以及孩子的父母的pid)。

fork返回时,它实际上返回两次:一次给父,一次给孩子。 它将0返回给子级,并将子级的pid返回给父级。

if块然后检测返回哪个进程。 在父进程中, if (pid)计算结果为true,则执行continue并跳转到循环的顶部。

在子进程中, if (pid)计算结果为false,那么if (pid == 0)计算结果为true,则执行break跳出循环。 所以孩子不要再分叉了。

但我不明白的是,这是如何防止子进程分叉?

fork()在子项中返回0。 在你的示例代码中,这会导致子break跳出循环而不是执行另一个迭代,所以这些子节点实际上不调用fork()

在检查我为什么这个程序打印“叉”4次? 。 对我来说似乎很简单。

这如何防止子进程分叉?

 if (pid) { continue; } 

你可以看到孩子什么时候被创建,然后执行它的代码,并调用fork()它成为该阶段的父代 ,因此pid将为0。

尝试man 2 fork 。 fork(2)为父类和子类返回一个不同的值,父类获得pid ,孩子得到0