[英]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.