僵死进程

来源:互联网 发布:黑马程序员就业班试题 编辑:程序博客网 时间:2024/05/16 16:01

      Linux系统中,如果子进程结束了,它是不是简单地就消失了呢?但是这样它退出返回时的相关信息——譬如它是否正常结束,以及它的退出值也一起丢掉。那它到底以什么形态存在于系统中呢?

 

      在Linux系统中,子进程在结束的时候,Linux会给父进程发送一个SIGCHLD的信号,而父进程对该信号的的处理,决定了已结束的子进程以什么样的形态存在于系统。(父进程先于子进程结束等下我们再做讨论)

 

1、当子进程先于父进程结束:

  •        对SIGCHLD采用默认的处理方式

 

在默认的处理方式下,子进程先于父进程结束,子进程会变成僵死进程,等待父进程来提取子进程的退出时的信息,即等待父进程来清理(父进程可以调用wait()函数清理的),若父进程结束之前都未清理僵死的子进程,在父进程结束之后,系统会清理掉这些僵死的子进程。

以下是在我机器上运行上面程序的结果:

 

 

第一个ps是5秒之前,子进程还未结束,第二个ps是5秒之后,子进程结束了,但父进程并未清理它,所以子进程变成了僵死进程。在杀死父进程之后,系统也清理掉了僵死进程。

  • 采用SIG_IGN处理方式

子进程结束之后,父进程会忽略SIGCHLD信号,由系统来清理这些结束的子进程,所以不存在僵死进程。

以下是把上面代码修改 的运行结果:

 

 

所以上面修改后程序在5秒之后,系统清理结束的子进程。

 

  • 自定义处理方式(异步清理子进程)......

也就是自定义对SIGCHLD信号的响应,可以自己定义响应函数,上面自定义的响应SIGCHLD函数是在调用wait清理子进程(不过这个对响应信号是不安全,在信号响应函数里尽量使用原子操作)。

 

2、父进程先于子进程结束

 

 子进程会过渡给init 1号进程,但子进程结束,1号进程负责清理子进程,其实上面的杀死父进程之后,僵死子进程过渡给1号进程init,之后1号就清理掉了僵死的子进程。

 

以上都是个人理解,若有错误欢迎指出!

 

原创粉丝点击