我一直在努力学习fork和进程。我刚刚遇到这段代码的一个小问题,并试图理解为什么?
我试图通过系统调用Fork
复制流程,并且pid
的值为正,它会触及父级,并返回其getpid()
。同时它击中了孩子并返回了getpid()
。但问题是,当我在这里调出getppid()
时,预计会显示其父进程标识符,该标识符恰好是 3370 。
但是在编译和执行此文件时,它显示getppid()
的值为 1517 (不是父级的ID)。
我在Oracle VM VirtualBox(32位O.S.)上使用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$
我很清楚,如果父母在孩子面前死亡,孩子会自动被原来的&#34; init&#34;过程,PID
1.但这里肯定不是这种情况。
答案 0 :(得分:0)
当父进程在执行getppid()
之前终止时,会发生这种情况。在父母的末尾使用wait(NULL)
来解决问题。