exit和wait一起可以彻底清除子进程的资源
发布日期:2021-06-24 18:06:46 浏览次数:4 分类:技术文章

本文共 2209 字,大约阅读时间需要 7 分钟。

#include
#include
#include
#include
#include
int main() { pid_t p1,p2,pr; int i; for(i=0;i<=2;i++) { if((p1=fork())==0) { printf("parent process%d child process%d\n",getppid(),getpid()); exit(0); //我发现把return 0替换为exit(0)也可以的!,不过编译器这两种的处理区别很大,以后再做解释
}  else{  pr=wait(NULL);//如果成功,wait会返回被收集的子进程的进程ID,//如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。  if( pr>0)     printf("I catched a child process with pid of %d\n", pr);   else     printf("error: %s\n.\n", strerror(errno));   } } return 0;} 输出结果如下:parent process4595 child  process4596I catched a child process with pid of 4596parent process4595 child  process4597I catched a child process with pid of 4597parent process4595 child  process4598I catched a child process with pid of 4598当把exit注释后输出结果如下:parent process4642 child  process4643parent process4643 child  process4644parent process4644 child  process4645I catched a child process with pid of 4645I catched a child process with pid of 4644parent process4643 child  process4646I catched a child process with pid of 4646I catched a child process with pid of 4643parent process4642 child  process4647parent process4647 child  process4648I catched a child process with pid of 4648I catched a child process with pid of 4647parent process4642 child  process4649I catched a child process with pid of 4649//重新执行一边的结果parent process4657 child  process4658parent process4658 child  process4659parent process4659 child  process4660I catched a child process with pid of 4660I catched a child process with pid of 4659parent process4658 child  process4661I catched a child process with pid of 4661I catched a child process with pid of 4658parent process4657 child  process4662parent process4662 child  process4663I catched a child process with pid of 4663I catched a child process with pid of 4662parent process4657 child  process4664I catched a child process with pid of 4664从上面的输出结果可以得出:exit可以用来释放进程的资源,必须加上,当注释掉时,可能因为子进程的资源没有及时清理掉,所以导致wait阻塞住,不能及时清理掉子进程!总结:当进程发出exit该调用时,内核会释放进程占有的资源,释放进程上下文所占的内存空间,保留进程表项,将进程表项中记录进程状态的关键字设为僵死状态。内核在进程收到不可扑捉的信号时,会从内核内部调用exit,使得进程退出。父进程通过wait,并释放进程表项。

 

转载地址:https://blog.csdn.net/weixin_34248258/article/details/85668579 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:很酷的C语言技巧
下一篇:STL——increment/decrement/dereference操作符

发表评论

最新留言

不错!
[***.144.177.141]2024年04月07日 07时22分55秒