UNIX环境编程:进程的终止

来源:百度文库 编辑:神马文学网 时间:2024/04/28 00:05:22

UNIX环境编程:进程的终止

摘要:本文介绍UNIX环境下进程终止的相关内容,指出当一个进程终止时,对于一个系统将要产生哪些影响,内核会作出怎样的处理,进程的父进程需要如何处理。

一个进程在何时终止,进程的终止方式存在两种,一种是进程主动终止,另一种是进程被动终止。主动终止的进程或许完成自己所有的事务,或者意识到自身已经处于非法状态;被终止的进程往往都因为产生了某种信号,而进程自身没有对这个信号作出处理,相应地内核采用默认的行为,把进程终止了。

进程主动终止的方式有:

  • 进程直接调用exit函数,exit函数是一个标准库函数,它会在清理进程环境之后,调用系统级接口_exit或_Exit。
  • 从main函数中返回,此时实现会调用exit函数,此种方式完全等同与直接调用exit函数。
  • 进程调用_exit或_Exit函数,此时进程不会去清理进程环境,也不作信号处理;作为系统调用,它们会在内核态中完成一个进程终止工作。
  • 进程的最后一个线程返回或调用pthread_exit,对于单线程进程而言这是不存在的。

 

对于被动终止的情况,进程自身没有控制能力,除非进程去处理可能遇见的所有的信号,并在确认自身进入非法状态后优雅地退出,此时会报告错误或指出合适的处理方式。无论进程最终是如何终止的,内核都会作出处理,并且这些处理都包括关闭没有关闭的文件描述符,清理没有清理的资源等等,把进程的事实保存以等待进程的父进程来获取消息。

进程在终止时,内核会通过发送信号SIGCHLD来通知进程的父进程,此时父进程可以通过wait或waitpid来取得内核保存少量关于进程终止的信息,包括进程退出状态。一个进程终止时,父进程总是需要“等待”,否则的话进程会变成一个僵死进程,僵死的进程不会再做任何事,它存在的目的只是让其父进程等待,以获得它的终止信息。僵死进程也会消耗系统资源,所有父进程需要在恰当的时候等待子进程的终止,此时往往收到信号的时候。

存在这样的一个情况,就是一个进程的父进程比子进程更早地终止了,这样的进程称为孤儿进程,孤儿进程只是一个进程的过渡状态,进程算账永远不知道自己会变成孤儿,因为如果它的父进程终止了,内核会让init进程来收养这个进程。作为超级进程init它是内核直接产生,其它所有进程都由init进程直接或间接产生,如果它终止了,此时只可能发生在系统关机或者崩溃的情况。