This question already has answers here:
Why do processes I fork get systemd as their parent?

(3个答案)


4年前关闭。




我一直在尝试了解fork和流程。我只是在这段代码中遇到了一个小问题,并试图理解为什么?
我试图通过系统调用Fork复制一个进程,并且pid的值为正,它命中了父级,并返回了getpid()。同时,它击中了 child ,并返回了其getpid()。但是问题是,当我在此处调用getppid()时,希望它显示其父级的进程标识符,该标识符恰巧是 3370
但是在编译和执行此文件后,它显示getppid()的值为 1517 (不是 parent 的ID)。

我在Oracle VM VirtualBox(32位操作系统)上使用ubuntu 14.04 LTS。此forking.cpp文件的代码如下:
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <cstdlib>

using namespace std;

int main()
{
    pid_t pid1;
    pid1 = fork();
    if(pid1 == -1)
    {
        cout << "No child process formed: " << getpid() <<endl;
    }
    else if(pid1 == 0)
    {
        cout << "Child has been formed: " << getpid()<< " and its parent's id: " << getppid() << endl;
    }
    else if(pid1 > 0)
    {
        cout << "Parent process has been called: " << getpid() << endl;

    }

    cout << "END of Stuffs" << endl;
    return 0;
    exit(0);
}

为了进行编译,我在终端上使用了g++ forking.cpp命令,并执行了./a.out
然后显示如下:
Parent process has been called: 3370
END of Stuffs
Child has been formed: 3371 and its parent's id: 1517
END of Stuffs

shashish-vm@shashishvm-VirtualBox:~/Desktop$

我知道,如果 parent 在 child 之前去世,那么这个 child 会被原始的“init”进程自动采用PID 1收养,但是这里绝对不是这种情况。

最佳答案

当父进程在执行getppid()之前终止时,会发生这种情况。在父级末尾使用wait(NULL)解决问题。

关于c++ - getppid()不返回 parent 的pid ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24385235/

10-14 03:19