使用fork创建子进程时,父ID与父ID不同[重复]

Posted

技术标签:

【中文标题】使用fork创建子进程时,父ID与父ID不同[重复]【英文标题】:When a child process is created with fork, the parent ID is not as the same as the parent ID [duplicate] 【发布时间】:2017-01-15 06:19:26 【问题描述】:

为了解释我要问的问题,让我们考虑一下这段代码,

#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。

【问题讨论】:

这是一个可怕的布局。如果您在 Pico 中编程,请使用它。如果您使用 C 编程,请使用正统的 C 布局——不是那样。 【参考方案1】:

问题是父进程 (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

【讨论】:

我测试了你所说的,并且成功了,谢谢:)

以上是关于使用fork创建子进程时,父ID与父ID不同[重复]的主要内容,如果未能解决你的问题,请参考以下文章

什么是父进程和子进程?

php多进程编程实现与优化

进程fork

如何使用 fork() 将数字与父进程和子进程相加 [重复]

子进程怎么操作父进程中的变量

Linux-fork创建子进程