我是一名新的C ++程序员,我正在努力弄清楚父和流程是如何工作的。为此,我尝试根据这里的代码创建三个进程。但是,我知道我们应该在每次创建子进程后退出以允许其他子进程,但我不明白在第二个for循环中,我们等待(NULL)三次。我们为什么这样做?这是我第一次尝试了解父母与子女的过程。如果你给我一个学习的来源,我很高兴。谢谢!
int main(){
cout<<" Dad process is "<<getpid()<<endl;
for(int i=0;i<3;i++){
if(fork()==0)
{
cout<<"Son pid "<<getpid()<<" from pid "<<getppid()<<endl;
exit(0);
}
}
for(int i=0;i<3;i++){
wait(NULL);
}
}
`
答案 0 :(得分:1)
如果没有wait()
调用,父进程将立即终止,而子进程可能会继续运行。
对于像这里所示的简短的简短程序,它并不重要。
但是对于更大,更复杂的应用程序,子进程执行大量工作:让父进程终止会让人感到困惑。它留下的印象是刚刚执行的过程完成了它的工作。你回到了命令/ shell提示符,没有立即意识到子进程仍在做他们正在做的事情。
此外,如果其中一个子进程遇到错误并以非零退出代码终止,则wait()
父进程可以收集退出代码,并使用非零退出代码终止自身,表明进程失败。
答案 1 :(得分:0)
引自https://linux.die.net/man/2/wait:
...用于等待调用进程的子进程中的状态更改,并且 获取有关状态发生变化的孩子的信息。一个状态 改变被认为是:孩子终止......
以及其他一些事情,但基本上这里的目的是等待终止子进程。
答案 2 :(得分:0)
当你调用wait(NULL)时,你要求操作系统等待任何子进程的“状态改变”。状态变化包括孩子从跑步状态到退出状态。
您可能应该调用waitpid(childid),这样您就可以了解您正在等待的孩子。换句话说:
int child_id = fork();
if (child_id == 0)
{
/* do useful child work */
}
else
{
waitpid(child_id, ...);
}
为什么要等孩子?
首先,你通常会要求孩子们做有用的工作,你想知道他们什么时候完成。
另一个原因是操作系统需要为该进程保留一些数据,即使它已经退出,直到你调用wait()。所以,不要叫等待,你的孩子最终会成为“僵尸”进程(你会在top
中看到它们。)
您可以在此处看到一些典型的实际用途:
https://github.com/deplinenoise/tundra/blob/master/src/ExecUnix.cpp#L102
你可以在这里找到文档:
https://linux.die.net/man/2/wait