注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云水居

云在青山水在天,人在江湖不得闲

 
 
 

日志

 
 

Linux进程:僵尸与孤儿  

2010-11-01 11:33:05|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

查看全文


一个C++程序,以main函数的return 0退出。真正的运行机制是:
gcc 在链接的时候,会在程序的结尾加入sys_exit系统调用。
运行时,进程执行sys_exit,发送SIGCHLD信号给父进程,然后,进程进入僵尸状态,变成僵尸进程,等父进程收尸。
这样就出来两个问题:
1. 如果子进程在执行sys_exit时,父进程已经死亡怎么办?
2. 如果子进程退出时,父进程不收尸怎么办?
“子存父先死,孙在祖乃丧”,如果父进程在子进程调用sys_exit之前已经死亡,子进程在执行sys_exit时,发的SIGCHLD信号就无人接收了。谁给子进程收尸呢?
托孤
答案是“托孤”,武侠小说的主角,往往在要死的时候,将主角托付给一个很牛的人,然后就去了。当一个进程的父进程在这个进程退出前退出的话,就会把这个进程的父进程修改为一个可以“托孤”的很牛的进程,在Linux下,这个进程是PID为1的init进程,每个进程在死亡前,都会把自己的子进程”托孤“给init进程。
在Linux0.11内核源代码的linux/kernel/exit.c的do_exit函数中,有这样一段”托孤“的代码:
108         for (i=0 ; i<NR_TASKS ; i++)
109                 if (task[i] && task[i]->father == current->pid) {
110                         task[i]->father = 1;

僵尸

进程在退出后就立刻变成了僵尸,然后等父进程收尸;
如果这时它的父进程已经死了,也就是说这个进程是个孤儿,也没问题,它的父进程临死前”托孤“的init进

查看全文

  评论这张
 
阅读(1197)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017