为什么我们在创建子进程时会使用wait?

时间:2016-10-27 11:03:31

标签: c++ process fork parent multitasking

我是一名新的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);
}

}

`

3 个答案:

答案 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