理解for循环中的fork()

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)

这是什么意思?感谢所有提前.

Who*_*aig 5

从初始化到完成第一个循环上下文的所有进程完成第一次完整迭代,将发生以下情况:

1.初始化器

i 初始化自 i = fork();

  • 流程父母:i = pid(child1)
  • 子进程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从父类继承,其中ipid(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);
  • child1进程替换execlp("echo", "sono", argv[0], 0);
  • child2进程调用system("echo i+$i");终止.
  • child3进程调用system("echo i+$i");终止.

这一点很重要:在任何时候,做任何前述方法的评估不止一次了,有条件了.成功完成条件测试的任何内容都将替换为execlp()流程启动.任何未通过条件测试的东西都将离开循环并在system()通话后终止.因此,一旦任何进程超过条件(通过成功或失败),它将永远不会是fork()另一个进程.

换句话说,这不是fork()炸弹.如果循环体或循环后面的后缀代码分叉了这个过程的另一个实例,它很容易成为fork()炸弹,但没有.


注意:pid-rollover 可能会导致进程ID重置并开始"填充漏洞",导致第一个初始fork引入一个小于 child1 pid的child2 pid.如果发生这种情况,(但不太可能),结果只会改为:

  • 父进程调用system(“echo i+$i”);并终止.
  • child1进程替换为 execlp("echo", "sono", argv[0], 0);
  • child2进程调用system("echo i+$i");并终止.
  • child3进程调用system("echo i+$i");并终止.

可能没有血腥,但随后也没有赢得彩票,人们认为它会一直发生在他们身上.