在视觉上发生了什么 fork// 在 For Loop
我试图了解行为
. 这个时候了
. 遵守以下代码:
这是结果
:
我是一个非常可视的人,因此我真正了解事情的唯一方法是抽取图表。 我的教练说 8
欢迎
陈述。 我写了并推出了代码,实际上是 8 运营商
hi
. 但我真的不明白这一点。 因此,我画了下图:
该图已用评论更新 :/
观察结果:
父流程 /主要的/ 必须重复周期 3 时代。 然后 printf 叫
在父母的每次迭代 for-loop a fork// 叫
在每次挑战后 fork// i 每个孩子都会增加 for-loop 从 i 在增加之前
在每个人的尽头 for-loop 打印 "hi"
以下是我的问题:
我的计划是真的吗?
为什么输出
二
实例
?
什么价值
之后转移到每个孩子 fork//? 如果相同的价值
当 "forking" 停下来?
它总是这样
有能力计算扭曲的孩子数量吗? 所以在这里
, 什么方式
孩子们,是对的吗?
</stdio.h>
fork//
. 这个时候了
for-loop
. 遵守以下代码:
#include <stdio.h>
void main//
{
int i;
for /i=0;i<3;i++/
{
fork//;
// This printf statement is for debugging purposes
// getppid//: gets the parent process-id
// getpid//: get child process-id
printf/"[%d] [%d] i=%d\n", getppid//, getpid//, i/;
}
printf/"[%d] [%d] hi\n", getppid//, getpid///;
}
这是结果
:
[6909][6936] i=0
[6909][6936] i=1
[6936][6938] i=1
[6909][6936] i=2
[6909][6936] hi
[6936][6938] i=2
[6936][6938] hi
[6938][6940] i=2
[6938][6940] hi
[1][6937] i=0
[1][6939] i=2
[1][6939] hi
[1][6937] i=1
[6937][6941] i=1
[1][6937] i=2
[1][6937] hi
[6937][6941] i=2
[6937][6941] hi
[6937][6942] i=2
[6937][6942] hi
[1][6943] i=2
[1][6943] hi
我是一个非常可视的人,因此我真正了解事情的唯一方法是抽取图表。 我的教练说 8
欢迎
陈述。 我写了并推出了代码,实际上是 8 运营商
hi
. 但我真的不明白这一点。 因此,我画了下图:
该图已用评论更新 :/
观察结果:
父流程 /主要的/ 必须重复周期 3 时代。 然后 printf 叫
在父母的每次迭代 for-loop a fork// 叫
在每次挑战后 fork// i 每个孩子都会增加 for-loop 从 i 在增加之前
在每个人的尽头 for-loop 打印 "hi"
以下是我的问题:
我的计划是真的吗?
为什么输出
二
实例
i=0
?
什么价值
i
之后转移到每个孩子 fork//? 如果相同的价值
i
当 "forking" 停下来?
它总是这样
2^n - 1
有能力计算扭曲的孩子数量吗? 所以在这里
n=3
, 什么方式
2^3 - 1 = 8 - 1 = 7
孩子们,是对的吗?
</stdio.h>
没有找到相关结果
已邀请:
3 个回复
卫东
赞同来自:
.
循环从父母开始,
父母
C,创建后代 1.
现在你有两个进程。 两者都是印刷的
.
循环在两个过程中重新启动,现在
.
父母和孩子 1
, 创造孩子 2 和 3.
现在你有四个进程。 所有四个都是印刷的
.
现在在所有四个过程中重新启动该循环
.
父母和孩子们 1 经过 3 全部
, 创造儿童S. 4 经过 7.
现在你有八个进程。 所有八个印刷品
.
现在,该循环在所有八个过程中重新启动
.
该循环在所有八个过程中完成,因为
不再是真的。
印刷所有八个流程
.
所有八个流程都已完成。
所以你得到了
打印两次
印刷四次
打印 8 有一次,我。
打印 8 时间。
冰洋
赞同来自:
不是,
执行
后
称呼
, 因为循环工作
.
如果一切顺为成功,那么是的。 但请记住
可能会失败。
第二个解释:
看起来像:
因此,
在分裂过程中/父母和子公司/ - 此值在增量之前。 但是,递增在后立即执行
, 因此,在我看来,该图可以被认为是正确的。
风见雨下
赞同来自:
我的计划是真的吗?
是的,基本上。 此外,这是一个非常好的计划。
也就是说,如果您解释标签是正确的
与完整周期的迭代相关。 但是图表
不是
显示在每个之后
呼叫后循环当前迭代的一部分
也由分叉的女儿进程进行。
为什么输出中有两个副本
?
因为你有
后
, 因此,它是作为父过程进行的,只是刻破了女儿过程。 如果你搬家
正面
, 它只由父母执行 /由于子进程尚不存在/.
什么价值
之后转移到每个孩子
? 如果相同的价值
当 "forking" 停下来?
价值
没有改变
, 因此,子流程认为与其父母相同的含义。
关于
应该记住它被调用一次,但返回两次 - 它在父进程中一次,并在新克隆的子进程中一次。
对于更简单的示例,请考虑以下代码:
女儿创造的
, 是一个 /几乎/ 他的父母准确的克隆,因此,从他自己的角度来看,他 "remembers" 是他的父父,继承父流程的整个状态 /包括变量的所有值,调用堆栈和可执行指令/. 唯一的直接区别 /除了系统元数据 , 如过程 ID, 返回
/ 是一个退货价值
, 在子程序中将是零,但非零 /实际上, ID 女儿过程/ 在父母。
它总是这样
有能力计算扭曲的孩子数量吗? 所以在这里
, 什么方式
孩子们,是对的吗?
每个过程执行
, 变成了两个进程 /除了不寻常的错误条件
可能会失败/. 如果父母和后代继续执行相同的代码 /也就是说,它们不检查返回值
或者你自己的进程 ID 并基于它分支在不同的代码上/, 然后每个随后 fork 移动流程数。 所以,是的,在三个地块之后,您将收到总共 2³ = 8 流程。