我试图了解一些 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/