繁体   English   中英

创建子进程时为什么要使用等待?

[英]Why do we use wait when we create child processes?

我是一名新的C ++程序员,我试图弄清楚父级和进程的工作方式。 为此,我尝试根据此处的代码创建三个进程。 但是,我知道我们应该在每次创建子进程之后退出以允许其他子进程,但是我不明白在第二个for循环中,我们等待(NULL)3次。 我们为什么要这样做呢? 这是我第一次尝试了解父子过程。 如果您也给我学习的资源,我也很高兴。 谢谢!

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);
}

}

`

没有wait()调用,父进程将立即终止,而子进程可能会继续运行。

对于一个简短,简短的程序(如此处所示),没什么大不了的。

但是对于一个更大,更复杂的应用程序,子进程执行大量工作:终止父进程会造成混乱。 它给人的印象是刚刚执行的过程完成了它的工作。 您返回到命令/ shell提示符,而没有立即意识到子进程仍在执行其正在执行的操作。

此外,如果子进程之一遇到错误并以非零退出码终止,则wait()父进程可以收集该退出码,并以非零退出码终止自身,表明该进程具有失败了

当您调用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

引用来自https://linux.die.net/man/2/wait

...用于在调用过程的子进程中等待状态更改,并获取有关其状态已更改的子进程的信息。 状态更改被认为是:子项已终止...

以及其他一些事情,但是本质上,这里的目的是等待子进程的终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM