如何得知子孙进程中有孤立进程产生

vollin 2005-10-24 04:36:37
在正常的操作下,init确定getty正在工作着(用以允许用户登录),并且收取孤立进程(父辈进程已结束的进程;在UNIX中所有的进程必须属于单棵进程树,所以孤立进程必须被收取)。

请问init是如何知道有孤立进程产生的呢?
如果我想自己维护一棵进程树,即一个类似init的进程,要知道何时我的子孙进程中产生了一个孤立进程,并将其收取.
...全文
145 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldbiestar 2005-10-28
  • 打赏
  • 举报
回复
哦,对,我搞错了,父进程结束的进程的确是成为init的子进程(这个可以参考APUE第八章,但是我好像曾经在哪里看到过父进程结束的进程的父进程被设置为原父进程的父进程的这个说法,有待进一步查证)。

不过,这个行为是kernel完成的我并没有说错。
--------------------------------------------------
在一个进程终止时,内核逐个检查所有活动进程,以判断它是否是正要终止的进程的子进程,如果是,则该进程的父进程I D就更改为1(init进程的ID)
--------------------------------------------------
引自APUE第八章第五节
vollin 2005-10-28
  • 打赏
  • 举报
回复
tb01412(tb)
不对吧,做个很小的实验就可以知道了,并不是将子进程的父进程指定为结束进程的父进程,
而是被init接收了。看样子,这个问题是没有办法了。
vollin 2005-10-26
  • 打赏
  • 举报
回复
再次感谢。:)
tb01412 2005-10-26
  • 打赏
  • 举报
回复
内核在处理_exit系统调用时,就会将结束的进程的资源释放,在释放任务结构时就会将它的子进程的父进程标识指向所结束的进程的父进程
yyy790601 2005-10-26
  • 打赏
  • 举报
回复
那就复杂点。
1.system("ps -Al >log");
2.分析文件log,提取PPID=1的进程。
3.利用kill()或者singal()进行相应处理。

但是问题是并非所有ppid=1的进程都是孤立进程,还需别的判断。建议参考《UNIX环境高级编程》第九章。
vollin 2005-10-26
  • 打赏
  • 举报
回复
这个帖子我最开始发表在程序开发区,不过没有人能回答所以移到这里,希望高手们帮忙。
yyy790601 2005-10-25
  • 打赏
  • 举报
回复
子进程里调用getppid(),得到父进程pid,如果是1,发信号给你的init进程,通知现在是孤儿进程。
vollin 2005-10-25
  • 打赏
  • 举报
回复
是不是我发错了地方?有没有人告诉我可以在什么地方得到答案?谢谢各位了。
vollin 2005-10-25
  • 打赏
  • 举报
回复
yyy790601的答案倒是很特别,不过如果这些子进程都不是自己写的程序,那如何去规范它呢?
如果是我自己写的程序,我就直接把所有的pid都记录下来不就行了。还用得着这样吗?
不过还是很感谢你的答案,如果过两天没有人提供答案,分就是你的了。
vollin 2005-10-24
  • 打赏
  • 举报
回复
兄台,不对啊,当一个进程结束时,会将其子进程设为init(1)的子进程。
oldbiestar 2005-10-24
  • 打赏
  • 举报
回复
一个进程结束的时候kernel自己会把这个进程的子进程设置为这个结束的进程的父进程的子进程……这个不需要额外的干预,kernel自己完成……

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧