skr*_*ets 3 c unix loops fork for-loop
我理解有问题fork()
.任何人都可以解释一下,这个节目会打印什么?因为我准备考试,这是典型的问题.正是在这种情况下:
#include <stdio.h>
int main(int argc, char **argv) {
int i;
for(i = fork(); i < fork(); i++)
execlp(“echo”, “sono”, argv[0], 0);
system(“echo i+$i”);
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这条线是不可理解的
for(i = fork(); i < fork(); i++)
Run Code Online (Sandbox Code Playgroud)
这是什么意思?感谢所有提前.
从初始化到完成第一个循环上下文的所有进程完成第一次完整迭代,将发生以下情况:
1.初始化器
i
初始化自 i = fork();
i = pid(child1)
i = 0
在每个过程中进行条件测试会发生一些有趣的事情
2.流程:父母
i < fork()
将分叉另一个子进程,child2.如果返回pid(child2)
的值大于pid(child1)
,则满足条件测试,父进程继续循环体
3.过程:child1
i
从初始化器开始为零
i < fork()
将fork一个子进程,child3.如果返回pid(child3)
的值大于i
(为零,那么它总是如此),则满足条件测试并且child1进程继续循环体
4.过程:child2
i
从父类继承,其中i
是pid(child1)
i < fork()
,所以fork()
eval为0.因此......i < fork()
将评估是child1(pid) < 0
,永远不会是真的.条件测试失败,for循环终止.5.过程:child3
i = 0
从其父级child1 继承.i < fork()
,所以fork()
eval为0.因此......i < fork()
将评估是0 < 0
,永远不会是真的.条件测试失败,for循环终止.此时,parent和child1是进入循环体的唯一两个进程.另外两个(child2和child3)都没有通过条件检查.结果,发生以下事情:
6.最后的步骤
execlp("echo", "sono", argv[0], 0);
execlp("echo", "sono", argv[0], 0);
system("echo i+$i");
并终止.system("echo i+$i");
并终止.这一点很重要:在任何时候,做任何前述方法的评估不止一次了,有条件了.成功完成条件测试的任何内容都将替换为execlp()
流程启动.任何未通过条件测试的东西都将离开循环并在system()
通话后终止.因此,一旦任何进程超过条件(通过成功或失败),它将永远不会是fork()
另一个进程.
换句话说,这不是fork()
炸弹.如果循环体或循环后面的后缀代码分叉了这个过程的另一个实例,它很容易成为fork()
炸弹,但都没有.
注意:pid-rollover 可能会导致进程ID重置并开始"填充漏洞",导致第一个初始fork引入一个小于 child1 pid的child2 pid.如果发生这种情况,(但不太可能),结果只会改为:
system(“echo i+$i”);
并终止.execlp("echo", "sono", argv[0], 0);
system("echo i+$i");
并终止.system("echo i+$i");
并终止.可能没有血腥,但随后也没有赢得彩票,人们认为它会一直发生在他们身上.