gpt4 book ai didi

linux - wait() 在 Linux 中如何工作?

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

谁能解释一下为什么输出是这样的?我对这些进程的执行方式(按什么顺序?)以及 waitpid()/wait() 感到非常困惑。这是代码:

#include<stdio.h>
main()
{
int pid1, pid2, pid3;
pid1=fork();
if(pid1 == 0){
printf("PID of child 1 is :%d\n",getpid());
//sleep(2);
}
pid2=fork();
if(pid2 == 0){
printf("PID of child 2 is :%d\n",getpid());
//sleep(2);
}
pid3=fork();
if(pid3 == 0){
printf("PID of child 3 is :%d\n",getpid());
//sleep(2);
}
else{
printf("PID of parent is :%d\n",getpid());
waitpid(pid1,0,0);
waitpid(pid2,0,0);
waitpid(pid3,0,0);
}
}

实际输出:

PID of child 1 is :4963

PID of parent is :4962

PID of parent is :4963

PID of child 2 is :4966

PID of parent is :4966

PID of child 2 is :4964

PID of parent is :4964

PID of child 3 is :4967

PID of child 3 is :4965

PID of child 3 is :4969

PID of child 3 is :4968

预期输出:

  1. parent 的 PID,因为 pid1 不为 0 并且永远不会在这里为 0。

  2. 然后等到 pid1,即 child1 被终止并打印 child 1 的 PID

  3. 那么现在 child2 和 child3 还没有 fork ,所以他们被跳过了

  4. 然后又是parent的PID,child1的pid,child2的pid

  5. 然后是parent的PID,child1的pid,child2的pid,child3的pid。

请问我哪里出错了?

最佳答案

我们开始...

pid1=fork()

此时有两个进程正在进行。父项 [PID 4962] 和刚刚生成的子项 [PID 4963]。 parent 有 pid1 = 4963 [ child 的 PID], child [child1] 有 pid1 = 0。所以, child 会打印出:

"PID of child 1 is: 4963"

这两个过程都会继续进行,直到他们到达:

pid2=fork()

这里,parent [PID 4962] 和 child1 [PID 4963] 都产生了一个子进程。我们将调用原始父派生的 child child2 [可能是 PID 4964] 和 child1 派生的 child ,我们将调用 child1_1 [可能是 PID 4966]。现在,原来的 parent 有pid2 = 4964 [可能],child2 的 pid2 = 0。Child1 的 pid2 = 4966 [可能],child1_1 的 pid2 = 0。因此,child2 和 child1_1 都会打印出一些内容:

"PID of child 2 is: 4966"
"PID of child 2 is: 4964"

现在,所有这些流程都达到了这个目的:

pid3=fork()

哎呀。

原始父进程、child1、child2 和 child1_1 都产生了一个子进程。你什么最终结果是这样的:

对于原来的parent,child1,child2,child1_1,pid3 != 0对于他们的四个子进程,pid3 == 0

所以,这四个子进程都这样报告它们的 PID:

"PID of child 3 is: xxxx"

但原始父 [4962]、child1 [4963]、child2 [可能是 4964] 和 child1_1 [可能是 4966]打印:

"PID of parent is: xxxx"

然后等待其 PID 为 pid1、pid2 和 pid3 的子进程返回。

请记住,所有这些进程都是同时运行的,这就解释了为什么你不一定能预测打印语句的顺序进行。

关于linux - wait() 在 Linux 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26636659/

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