这是好久之前看的了,我那个时候就有一个问题没有弄清楚,现在总算是明白了一点点,总比没有明白强吧,
首先我得说一下我使用的系统 是 Ubuntu 14:04.5 X64 。
为什么要说一下系统呢,因为我的问题的出现就是根据系统而来的。
首先我想说一下孤儿进程,进程有很多,我都快忘记了,例如 僵尸进程,孤儿进程,父进程,子进程,等等。
在这里我想说的是孤儿进程:
首先说明一下孤儿进程的出现,在父进程结束的时候他创建出来的子进程没有结束,这个时候子进程没有了父亲
他就称为了孤儿,这个进程就是孤儿进程了,这样说的话应该能明白一点吧。
但是无论是什么进程都有死亡的时候,死亡就代表着要释放空间也就是资源,但是这个资源是需要一些进程回收的。
例如 :父进程中子进程死亡了,父进程就会回收子进程的资源,父进程死亡了,int进程就会回收他的资源,
但是如果父进程死亡了。子进程还没有死亡,这个时候是谁回收他的资源呢?
我的问题便是在这里开始的 :
我记得老说说过,父进程如果在子进程还没有回收之前就死亡了,他就会成为孤儿进程会被init进程收养。
在子进程死亡的时候init进程就会代替子进程的父进程把子进程的资源回收。
我一开始听的听明白的。但是我使用我的系统敲一遍这个过程,发现我的回收是不对的,为什么会出现这样的问题呢?我也在反思,我的代码思想是 :首先产生一个子进程,调用fork函数,这个函数的返回值不同进程判断代码是在父进程中还是在子进程中,在父进程中的代码让父进程立即死亡,而在子进程中的代码是让他先睡一会,之后再让他执行,最后给他一个无线循环,不让子进程死亡。子进程的死亡使用kill -9命令进程杀死。但是在子进程存在的时候我要看看子进程的父进程是谁,发现子进程的父进程ID != 1 这个是我最大的疑点,所以我重新敲打了一遍代码,发现还是这个问题,而且有时候这个ID还会变化。
后来我问别人发现是由于系统的原因,准确的说是内核的原因,这样的事情主要都是在Ubuntu 2006 年以后的版本中出现
我进而知道了 upstart 进程 :
这个进程的用处 :
- 更快地启动系统
- 当新硬件被发现时动态启动服务
- 硬件被拔除时动态停止服务