gpt4 book ai didi

c - 这个程序创建了多少个进程,它们是由哪些进程创建的?

转载 作者:太空宇宙 更新时间:2023-11-04 06:31:21 25 4
gpt4 key购买 nike

我正在跟踪这个程序并确定创建了多少个进程(假设没有发生错误)。我画了一个图表来可视化这些过程。在我的图表中,第一个进程由第一个 fork() 创建包含 1 ,并且我有箭头指向每个父进程的每个子进程。这看起来正确吗?

代码:

 1: child2 = 0;
2: child1 = fork(); // fork 1
3: if (child1 == 0)
4: {
5: child2 = fork(); // fork 2
6: }
7: fork(); // fork 3
8: if (child2 > 0)
9: {
10: fork(); // fork 4
11: }

图表:

                 0
/|\
/ | \
1 3 4
/ \ \
/ \ \
2 3 4
/ /
/ /
3 4
/
/
4

基本原理

  • 第一名fork()第 2 行的命令创建了 child 1 .
  • 第二个fork()第 5 行的命令创建了 child 2仅适用于 1 , 因为 if(child1 == 0) ,即唯一具有 fork() 的进程返回 0 到 child11 .
  • 第三 fork()第 7 行的命令创建了 child 3对于 0 , 1 , 和 2因为该语句由每个进程执行。
  • 第 4 fork()第 10 行的命令创建了 child 4对于除 2 之外的每个进程,因为每个进程都有一份 child2fork() 返回正值, 除了 2 , 在 child2 中会有一个 0 .

你怎么看?我是否正确解读了这段代码并绘制了图表?

更新

正确的图形是:

                 0
/ \
/ \
1 3
/|\
/ | \
2 4 3
/ \
/ \
3 4

最佳答案

应用于您的示例的 pstree 命令显示:

       bash-+-a.out-+-a.out-+-a.out---a.out
| |-a.out---a.out
| `-a.out
`-a.out

这看起来像下面每行只有一个进程。

       bash-+-a.out-+---------------------
+-a.out-+-------------
| +-a.out-------
| | `-a.out
| |-a.out-------
| | `-a.out
| `-a.out-------
`-a.out---------------

在分支重新排序后,匹配@Macattack 的答案。

请注意,您没有关于上图中进程创建的相对时间的信息;它只是最终结果。

为了理解图表,让我们看一下父进程 fork 后的树:

int main(void) {
int child1 = fork();
}

结果是:

  bash-+-a.out---a.out
^ parent ^child

然后,如果 child 再次 fork ,

int main(void) {
int child2 = 0;
int child1 = fork();
if (child1 == 0)
child2 = fork();
}

我们得到:

  bash-+-a.out---a.out---a.out
^ parent ^child ^grandchild

但是如果父节点再次 fork 而子节点没有,

int main(void) {
int child2 = 0;
int child1 = fork();
if (child1 > 0)
child2 = fork();
}

我们得到:

  bash-+-a.out-+-a.out  <- child1
^ `-a.out <- child2
parent

请注意,pstree 通过合并相同的 sibling 来压缩输出;您需要使用 -c 选项来防止出现这种情况并查看完整的树。

关于c - 这个程序创建了多少个进程,它们是由哪些进程创建的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20154647/

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