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

标签 c fork pid unistd.h

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

相关文章:

c - _Static_assert 与 __has_include

C:代码矩阵和重复元素按出现降序排列

c - 为什么使用 __attribute__((weak)) 和#pragma weak?

c - 了解 for 循环中的 fork() 和 exit() 的用法

python - 在 Python 中,如果不使用/proc 文件系统,我如何判断给定的 PID 是否正在运行?

c - 用户进程是否可以告诉操作系统将 mmap 完成的映射重新定位到其他 NUMA 节点?

c - SIGCHLD 未被捕获

c - setpgid 的竞争条件

java - "Inject"命令进入正在运行的进程

unix - 子进程在 fork() 之后始终为零且始终唯一?