gpt4 book ai didi

C 进程 fork()

转载 作者:太空狗 更新时间:2023-10-29 15:45:28 32 4
gpt4 key购买 nike

我正在探索 UNIX 中的父进程和子进程概念。我写了这段小代码,认为 x 没有。或进程将被创建。但是它创建了一个不同的数字 -

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argv, char *argc[])
{
int i;
pid_t childpid;

for(i=0; i<3; i++)
{
childpid = fork();
if(childpid == -1)
{
perror("Failed to Fork");
return 1;
}

if(childpid == 0)
printf("You are in Child: %ld\n", (long)getpid());
else
printf("You are in Parent: %ld\n", (long)getpid());
}
return 0;
}

OUTPUT:
You are in Parent: 30410
You are in Child: 30411
You are in Parent: 30410
You are in Child: 30412
You are in Parent: 30411
You are in Parent: 30410
You are in Child: 30413
You are in Child: 30414
You are in Parent: 30412
You are in Parent: 30411
You are in Child: 30415
You are in Child: 30416
You are in Parent: 30413
You are in Child: 30417

我知道在 fork() 情况下, parent 或 child 可能会优先执行。这并不困扰我,困扰我的是正在执行的进程数量。为什么是14?而不是一些 2^n 的数字,如果我们正在执行 fork(); 就会发生这种情况;叉(); fork() 即 fork 一个接一个。

我错过了什么?

更新:再澄清一下 -

The fork function copies the parent memory image so that the new process receives a copy of the address space of the parent.

这是什么意思?这是否意味着 -

  1. 子进程在fork()语句后开始执行?
  2. 子进程获取父进程变量的副本?所以如果 x=3 在 fork 之上,子进程会把这个 x 看成 3 吗?

最佳答案

8 个正在执行的进程,只是其中一些进程由于循环而打印了不止一次。

如果对输出进行排序:

You are in Parent: 30410
You are in Parent: 30410
You are in Parent: 30410

You are in Parent: 30411
You are in Parent: 30411
You are in Child: 30411

You are in Parent: 30412
You are in Child: 30412

You are in Parent: 30413
You are in Child: 30413

You are in Child: 30414

You are in Child: 30415

You are in Child: 30416

You are in Child: 30417

然后你可以看到只有8个唯一的进程ID。

这样做的原因很微妙。因为子进程(几乎)继承父进程的所有内容,所以它也获取循环的当前状态。我说“几乎”是因为某些事情是不同的,例如 PID(很明显)、父 PID(同样很明显)和某些资源限制(取决于操作系统)。

因此,当 i == 0 时处理 0一分为二。他们的下一个周期都在 i == 1 .这两个都将在下一个周期 fork i == 2 .等等。

如果查看下图,您可以看到创建过程。

      ____A____
/ | \
B_ C_ D
| \ \
E F G
\
H

/ , |\i 的点代表 fork 是0 , 12分别。

请注意,一个进程(例如 E )是从 i == 1 的父进程创建的只会用 i == 2 fork .换句话说,它是用 | 创建的。所以它的下一步是 \ .

同样,B/ 创建的( i == 0 ) 然后只会与 | fork ( i == 1 ) 和 \ (i == 2)。

如果您对 fork 的其他信息感兴趣,请参阅我的长篇文章 here ,以及有关 Linux 下不同 fork 选项内部结构的一些详细信息 here .

关于C 进程 fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999763/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com