gpt4 book ai didi

c - 了解 fork() 语句及其进程树

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:43 24 4
gpt4 key购买 nike

我试图找出使用以下 C 代码创建了多少个进程:

int main ()
{
fork();
if (fork()) {
fork();
}
fork();
return 0;
}

有几件事我很困惑:

每次调用 fork() 时,子进程是从代码的开头开始,还是从当前 fork() 创建它的地方开始?例如,如果第 3 行的第一个 fork 被调用,我会在第 4 行还是第 1 行启动子进程?我认为这是一个愚蠢的问题,b/c 如果每个 child 都从头开始,它会创建一个无限循环,但我想对这个假设保持安全。

接下来,当调用fork时,当前进程是否拆分为两个新进程,一个是父进程,另一个是子进程,或者当前进程自动成为父进程,所以实际上,只创建了一个额外的进程。

最后,通过 if 语句,我非常确定 fork 在实际上是父对象时返回父 id 的值,而在它是子对象时始终返回 0。那么,我假设 if 语句对于每个生成的 child 都是假的是否正确?

根据我上面的所有假设,这就是我想出的过程树,如果有人看到一个错误正在放弃它,我将不胜感激。树中子节点的数量表示当前正在发生 fork 的代码行:

        main
| | | |
3 4 5 7 // the main/initial process calls fork 4 times
| | | | |
4 5 7 7 7 // the first fork will see 3 additional forks since it was called
| | // at line 3 and I assume resumes at line 4.
7 7 // The second and third original children would each only callthe
// very last fork(). The last fork has no other forks following.

因此,总共创建了 10 个进程(包括 main)。我做错了吗?

最佳答案

(1) fork 之后的行。

(2) 一个新流程。 child 是 parent 的副本。

(3) fork 在父级返回子级 pid,在子级返回 0。 if 语句对每个 child 都是假的。它应该出现在 12 个过程中。我不擅长画图,但你应该能弄明白。

关于c - 了解 fork() 语句及其进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18840638/

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