为了解释我要问的问题让我们考虑一下这个代码,
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t child, parent;
parent = getpid();
printf("Main parent pid: %d\n",parent );
if((child = fork()) < 0) {
printf("Error\n");
} else if(child == 0 ) {
printf("A Child process is created, pid: %d, ppid: %d \n",
getpid(), getppid());
} else if(child > 0) {
printf("Parent says: Child pid: %d, getpid: %d, getppid: %d\n",
child, getpid(), getppid());
}
return 0;
}
当我在终端上执行此代码时,我得到了这样的输出
Main pid: 711
Parent says: Child pid: 712, getpid: 711, getppid: 598
A Child process is created, pid: 712, ppid: 1
据我了解,当我通过从已经创建的进程中分叉创建一个新进程时,这个新进程的父进程必须是我已经分叉的进程。正如您从输出中看到的那样,子进程的父进程ID是1,即init进程,为什么会这样呢?我理解错了,还是有其他一些我没看到的东西?
注意:我正在使用Mac OSX。
答案 0 :(得分:3)
问题是父进程(711)已经死亡,并且子进程在进行报告之前由init进程(1)继承。如果您让父母在退出之前等待孩子死亡,您将看到您期望的结果。
演示:
#include <sys/wait.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t child, parent;
parent = getpid();
printf("Main parent pid: %d\n", (int)parent);
if ((child = fork()) < 0)
{
printf("Error\n");
}
else if (child == 0)
{
printf("A Child process is created, pid: %d, ppid: %d\n",
(int)getpid(), (int)getppid());
}
else if (child > 0)
{
printf("Parent says: Child pid: %d, getpid: %d, getppid: %d\n",
(int)child, (int)getpid(), (int)getppid());
#ifndef DO_NOT_WAIT_FOR_CHILD
int status;
int corpse = wait(&status);
printf("Child %d exited with status 0x%.4X\n", corpse, status);
#endif
}
return 0;
}
在没有-DDO_NOT_WAIT_FOR_CHILD
的情况下编译时,我得到了示例输出:
Main parent pid: 77646
Parent says: Child pid: 77647, getpid: 77646, getppid: 46383
A Child process is created, pid: 77647, ppid: 77646
Child 77647 exited with status 0x0000
使用-DDO_NOT_WAIT_FOR_CHILD
编译时,我得到了示例输出:
Main parent pid: 77662
Parent says: Child pid: 77663, getpid: 77662, getppid: 46383
A Child process is created, pid: 77663, ppid: 1