当前位置: 首页 > 知识库问答 >
问题:

子进程的进程父ID与父进程的PID不同

冷宏茂
2023-03-14

我尝试使用C语言中的< code>fork()函数处理Linux中的多个进程,这是我的代码:

p1 = fork();

if(p1 != 0){
    p2 = fork();
}

printf("My PID is %d\n",getpid());
printf("My parent PID is %d\n",getppid());

现在让我们假设父进程ID为100,两个子进程(p1, p2)ID为101

My PID is 100
My parent PID is 0

My PID is 101
My parent PID is 100

My PID is 102
My parent PID is 100

相反,我看到了一些不同的东西,两个子进程具有相同的PPID,但第一个进程具有与之不同的PID。这是我得到的示例输出:

My PID is 3383
My parent PID is 3381

My PID is 3387
My parent PID is 1508

My PID is 3386
My parent PID is 1508

我的问题是,两个子进程的父PID不应该是3383吗?希望有人能解释这一切在这里是如何运作的,以及我做错了什么(或想错了什么)。

共有2个答案

红存
2023-03-14

你的代码没有任何问题

它只是您的父进程在子进程完成之前退出,因此它们成为孤儿并被init或任何实现定义的进程(在您的情况下为1508)采用。

请尝试Putin wait();让父进程完成所有子进程的执行。

乜安志
2023-03-14

【从评论中确认】

您的输出取决于时序。如果父进程在子进程之后完成,则输出将符合预期。

如果父进程在子进程之前完成,输出可能会令人惊讶(在父进程不再存在之前,父进程id会不同)。一旦父进程死亡(结束),init或一些其他实现定义的进程(在您的例子中是1508),成为子进程(ren)的新父进程。这样的子进程称为孤儿进程。

根据单一UNIX规范版本2中的退出手册页:

调用进程的所有现有子进程和僵尸进程的父进程ID应设置为实现定义的系统进程的进程ID。也就是说,这些进程将由一个特殊的系统进程继承。

为了避免这种情况,请确保在获取父进程pid时父进程处于活动状态。一种方法是在退出前添加一个等待父进程(或全部)。

 类似资料:
  • #include <stdio.h> #include <stdlib.h> int main(void) { pid_t pid; pid = fork(); if (pid < 0) { exit(1); } else if (pid > 0) { printf("Parent\n");

  • 问题内容: 是否可以从Shell脚本中的父进程ID获取子进程ID? 我有一个要使用Shell脚本执行的文件,这会导致一个新进程 process1 (父进程)。这个 过程1 已经分叉的另一个进程 过程2 (子进程)。使用脚本,我可以使用以下命令获取 process1 的pid : 但我无法获取子进程的pid。 问题答案: 只需使用:

  • 是否可以从外壳脚本中的父进程ID获取子进程ID? 我有一个要使用shell脚本执行的文件,这会导致一个新的进程process1(父进程)。此进程1已经派生了另一个进程process2(子进程)。使用脚本,我可以使用以下命令获得进程1的pid: 但是我无法获取子进程的pid。

  • 问题内容: 我正在使用python的多处理模块来生成新进程 如下 : 我想获取iostat命令的pid或使用多处理模块执行的命令 当我执行时: 它给了我运行此命令的subshel​​l的pid。 任何帮助都是有价值的。 提前致谢 问题答案: 你可以使用psutil:

  • 问题内容: 我在程序开始时设置了numpy随机种子。在程序执行期间,我使用多次运行一个函数。该函数使用numpy随机函数绘制随机数。问题是获取当前环境的副本。因此,每个进程都独立运行,并且都以与父环境相同的随机种子开始。 所以我的问题是如何在父环境中与子进程环境共享numpy的随机状态?请注意,我想用于自己的工作,需要使用一个 单独的类 并在该类中单独进行操作。我尝试使用来共享随机状态,但是似乎事

  • 本文向大家介绍WIN32程序获取父进程ID的方法,包括了WIN32程序获取父进程ID的方法的使用技巧和注意事项,需要的朋友参考一下 学过windows程序设计的人都知道,windows中的进程是可以有父子关系的,拥有父子关系的进程,一旦父进程结束,子进程有会随之退出。但是如果进程之间没有父子关系,我们如何让子进程在父进程退出是也同时跟着退出呢?方法有很多,本文介绍其中的一种利用父进程ID的方案,实