C++ getppid()未返回父项';s pid
我一直在努力学习fork和流程。我只是在这段代码中遇到了一个小问题,并试图理解原因?。 我试图通过系统调用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
复制一个进程,当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$