gpt4 book ai didi

c - 为什么我的 fork 进程的父进程 pid 与父进程自己的 pid 不同?

转载 作者:行者123 更新时间:2023-12-02 09:14:38 24 4
gpt4 key购买 nike

我试图了解一些 unistd.h 函数的工作原理。这是我写的代码:

#include <stdlib.h>
#include <unistd.h>

int main(){
pid_t pid;
pid=fork();
switch(pid) {
case 0: //child
printf("case 0:\nchild %d\nparent %d\n", getpid(), getppid());
break;
default: //parent
printf("default:\npid(child) %d\nparent %d\n", pid, getpid());
break;
}
}

我认为case 0中的getppid()获取的父pid和getpid()获取的父pid在 default 情况下应该是相同的,但这是我的小程序的输出:

default:
pid(child) 29208
parent 29207

Process returned 0 (0x0) execution time : 0.001s
Press ENTER to continue.
case 0:
child 29208
parent 1017

为什么它们不同? (一个案例为 29207,另一个案例为 1017)

最佳答案

你应该放慢执行速度。正如您在终端中看到的那样,子级在父级完成后执行。在这种情况下,它成为孤儿进程,并且其 PID 被重新分配给不同的进程。我不知道这在 Linux 上是否同样有效,但在我的 Mac 上,它被重新分配给进程 1。因此,在 each 父级的 printf() 之前添加 sleep() .

编辑

我已经编译(使用 llvm-gcc 编译)并在添加 sleep 之前运行您的代码:

 $  ./test
default:
pid(child) 2688
parent 2687
case 0:
child 2688
parent 1

然后:

 $  ./test 
default:
pid(child) 2780
parent 2779
case 0:
child 2780
parent 2779

编辑2

由于将 sleep() 放入子进程的 PID 中并不能解决任何问题,因此我更改了关于其放置位置的建议。

编辑3

由于是我的答案被接受,而不是托比的答案更好,所以值得一提的是,正确的同步机制将利用 wait()功能。

关于c - 为什么我的 fork 进程的父进程 pid 与父进程自己的 pid 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48398824/

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