gpt4 book ai didi

c - 了解 fork() 和 wait() 如何协同工作

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

这不在代码审查中,因为我不理解开始时代码的完整概念。如果仍应移动它,请告诉我。

我有一些代码,我想解释一下我的想法,我希望有人能告诉我我哪里出错了或感到困惑,因为我仍然不能完全确定发生了什么。

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid, pid1;
pid = fork();

if (pid < 0) {
fprintf (stderr, “fork() failed\n”);
return(1);
}
else if (pid == 0) {
pid1 = getpid();
printf (“pid = %d\n”, pid); // A
printf (“pid1 = %d\n”, pid1); // B
}
else {
pid1 = getpid();
printf (“pid = %d\n”, pid); // C
printf (“pid1 = %d\n”, pid1); // D
wait (NULL);
}
return 0;
}

据我了解,我们有两个进程 ID,父进程 (pid) 和子进程 (pid1)。一旦我调用了 pid = fork(),我相信 child 已经启动并获得了 0 的 ID,而 parent 获得了 child 的 ID,比方说 1337。所以 pid = 1337 和pid1 = 0。

所以我们跳过第一个 if 因为没有错误发生 (pid < 0),我们也跳过第二个 if 因为 pid 不等于 0,然后我们输入最后的 if,其中 C 将打印 1337,而 D 将输出 0。

我认为这会等到 child 完成。

之后,我假设复制的进程 (fork()) 将运行 else if (pid == 0) 但我不明白为什么,因为 pid 仍然是 1337。 .

TLDR:如果第三个 if 应该首先执行,那么我如何到达第二个 if,但如果这个逻辑全错了,请纠正我。

最佳答案

一个 fork 创建了一个正在运行的进程的(近乎完美的)副本。正如您推测的那样,一个区别是 fork() 本身的返回值。因此,假设 fork 有效,您有两个进程执行相同的代码。其一,子进程采用 if (pid == 0) ... 路径,而父进程采用 else... 路径。您没有关于这两个进程的工作顺序的信息。也许 child 先走,也许 parent 先走,也许走到一半他们轮流走,也许你有两个处理器,他们一起跑……

想象一下,您将这个程序写在一张纸上,并且您正在用手指沿着页面向下滑动。当你到达 fork 时,把纸拿到复印机上,复印一份,把两张纸放在 table 上,每只手的食指放在其中一张纸上,移动你的两根手指,每根手指都滑下来自己的一张纸。

关于c - 了解 fork() 和 wait() 如何协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25766467/

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