Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ getppid()未返回父项';s pid_C++_Linux_Pid_Fork - Fatal编程技术网

C++ getppid()未返回父项';s pid

C++ getppid()未返回父项';s pid,c++,linux,pid,fork,C++,Linux,Pid,Fork,我一直在努力学习fork和流程。我只是在这段代码中遇到了一个小问题,并试图理解原因?。 我试图通过系统调用Fork复制一个进程,当pid的值为正值时,它命中父进程,并返回其getpid()。同时,它击中了子对象并返回其getpid()。但问题是,当我在这里调用getppid()时,它应该显示其父进程标识符,它恰好是3370。 但在编译和执行此文件时,它将getppid()的值显示为1517(不是父id) 我在Oracle VM VirtualBox(32位操作系统)上使用Ubuntu14.04

我一直在努力学习fork和流程。我只是在这段代码中遇到了一个小问题,并试图理解原因?。 我试图通过系统调用
Fork
复制一个进程,当
pid
的值为正值时,它命中父进程,并返回其
getpid()
。同时,它击中了子对象并返回其
getpid()
。但问题是,当我在这里调用
getppid()
时,它应该显示其父进程标识符,它恰好是3370。 但在编译和执行此文件时,它将
getppid()
的值显示为1517(不是父id)

我在Oracle VM VirtualBox(32位操作系统)上使用Ubuntu14.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);
}

我知道,很简单,如果父对象先于其子对象死亡,则该子对象将自动被原始的“init”进程采用,并使用
PID
1。但是这里绝对不是这种情况。

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

无法复制,运行代码时两个PPID与此处预期的相同。您必须等待父级中的子级。如果父进程在子进程到达其
getppid()
之前停止,则进程id将在运行表中被替换
wait(NULL)
在父if块中,按照n.m建议输出后,应该可以到达那里(除非在重新分配世界的调试器中运行,这并不完全罕见)。是的,你是对的,我尝试了,结果成功了。尽管如此,我仍然担心为什么父进程在子进程执行之前终止?我的意思是,在这种情况下,我既不
休眠
-也不使子进程停止。因此,理想情况下,这两个过程应该并行运行,并最终同时显示结果。
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$