LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 844|回复: 5

后台进程

[复制链接]
发表于 2011-2-8 23:40:23 | 显示全部楼层 |阅读模式
大家新年好:
   最近在看《Harley Hahn's Guide to Unix and Linux》一书,读到“进程”这章后有些疑惑了。书上讲到,“当父进程创建子进程,但是没有等待子进程死亡”,子进程会成为孤儿进程,并且“当子进程死亡时,子进程就成为僵尸进程”。书上还说,“......这种现象仅当程序有bug,允许程序创建子进程而不等待子进程死亡时才可能发生”。
   但是我发现,后台进程似乎恰好有上述的特点。比如,当我在命令行中键入"sleep 20 &"后,下一个shell提示符立马就出来,不需等待20秒;这样,似乎就意味着,父进程shell在子进程“sleep 20 &”还没有死去就立刻苏醒。这样的话,按照书上的理论,这个子进程应该就是孤儿了,并且结束后就是个死不了的僵尸进程。但是事实上,大家都知道,刚才的那个子进程在20秒后就死了,没什么不死的僵尸进程。
   所以,我想请教诸位,对于上面的问题,是否有比较好的解释。在此先谢过诸位啦,嘿嘿。
发表于 2011-2-9 11:08:09 | 显示全部楼层
这里是多任务的。父进程是当前shell,你运行那个后台命令后,它并没有死,而是和子进程同时在运行。之所以能立即得到shell提示符,是因为后台进程在另外一个进程组里面,脱离了你的终端。

而且,如果一个进程的父进程死了,它的父进程会变为init,关机的时候init会杀死它。

相关概念: 进程,进程组,会话,控制终端,作业控制
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-2-9 21:23:38 | 显示全部楼层
Post by jacuro;2127657
这里是多任务的。父进程是当前shell,你运行那个后台命令后,它并没有死,而是和子进程同时在运行。之所以能立即得到shell提示符,是因为后台进程在另外一个进程组里面,脱离了你的终端。

而且,如果一个进程的父进程死了,它的父进程会变为init,关机的时候init会杀死它。

相关概念: 进程,进程组,会话,控制终端,作业控制

谢谢,有点明白了。刚才在网上浏览了一些这方面的网页,懂了一些。但我还有个问题,如果我在终端里输入"sleep 20 &",那么,20秒后,这个后台进程首先会变成僵尸;对于前台进程,父进程一旦苏醒,也就把这僵尸给收尸了;那一个后台进程变僵尸了,谁给它收尸而不致使它变成zombie呢?谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-2-11 00:50:29 | 显示全部楼层
求教中~~~~~
回复 支持 反对

使用道具 举报

发表于 2011-2-11 11:18:52 | 显示全部楼层
你还是没明白之前的回复,后台进程和shell同时在运行,父进程(即Shell)没有死,后台进程执行完毕之后,Shell会自己收割它。
而且所谓僵尸进程,简单来说就是它运行结束了(调用exit(),或者从main函数返回),但是父进程没有对它调用wait(这样分配给这个进程的一些资源无法被系统回收).

没必要纠结于这个问题,没什么意义。如果真想了解,可以找一些讲解Linux进程管理的资料看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-2-11 21:27:15 | 显示全部楼层
多谢ls细心指导,嘻嘻。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表