为什么我的分叉进程的父 pid 与父进程自己的 pid 不同?

Why does my forked process's parent pid differ from the parent's own pid?

我正在尝试了解某些​​ 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和default中的getpid()得到的父pid应该是一样的,但这是我的小程序的输出:

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)

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

编辑

我已经编译(用 llvm-gcc 编译)和 运行 你的代码,然后再添加睡眠:

 $  ./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

EDIT2

由于将 sleep() 放入 child 的 PID 中无法解决任何问题,因此我更改了关于它应该放置在何处的建议。

EDIT3

因为接受的是我的答案而不是 Toby 的,哪个更好,值得一提的是适当的同步机制将利用 wait() 函数。

如果 parent 没有为 child wait(),它可能会在 child 调用 getppid() 之前退出。如果您希望 parent 仍然存在并成为 parent,您可以通过使其等待来确保这一点:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    const pid_t pid = fork();
    switch (pid) {
    case 0:
        printf("in child: me: %d; parent %d\n", getpid(), getppid());
        break;
    default: //parent
        printf("in parent: child: %d; me %d\n", pid, getpid());
        wait(NULL);
        break;
    }
}

(为了您的方便,我还添加了您忘记包含的 headers - 这表明您没有在编译中启用足够的警告)。