学科分类
目录
Linux编程

进程退出

Linux系统中进程的退出通过exit()函数实现。exit()函数存在于系统函数库stdlib.h中,其函数声明如下:

void exit(int status);

在进程中,exit()函数的功能其实就相当于“return 返回值”,其中参数status表示进程的退出状态,0表示正常退出,非零表示异常退出,一般使用-1或1表示,为了增强可读性,标准C中定义了两个宏:EXIT_SUCCESS和EXIT_FAILURE,分别表示正常退出和非正常退出。在本章的案例1~3中已经使用过该函数。

Linux系统中有一个与exit()函数非常相似的函数——_exit(),_exit()函数定义在unistd.h中,其函数声明如下:

void _exit(int status);

exit()和_exit()都是用来终止进程的,但它们所做的操作有些许差别:当程序执行到_exit()函数时,系统会无条件地停止剩下操作,终止进程,并清除进程所用内存空间以及进程在内核中的各种数据结构;exit()函数对_exit()进行了包装,在执行退出前还有若干道工序,最重要的就是它会在调用_exit()之前先检查文件的打开情况,将缓冲区中的内容写回文件。相对而言,exit()函数相比_exit()函数更为安全。

多学一招:特殊进程

Linux系统中有两种特殊的进程:孤儿进程和僵尸进程。

父进程应负责子进程的回收工作,但父子进程是异步运行的,父进程不知道子进程什么时候接收,父进程甚至会在子进程结束之前结束。若父进程在子进程退出之前退出,子进程就会变成孤儿进程,此时子进程会被进程init收养,之后init会代替其原来的父进程,完成状态收集工作。

因为Linux系统中父子进程是异步运行的,父进程不知道子进程何时终止,为了保证父进程在需要时能接收到子进程结束时的状态信息,Linux使用僵尸进程这一机制。

当进程调用了exit()函数后,该进程并不是马上消失,而是留下一个称为僵尸进程(Zombie)的数据结构。僵尸进程是Linux系统中的另一种特殊进程,它几乎放弃进程退出前占用的所有内存,既没有可执行代码,也不能被调度,只在进程列表中保留一个位置,记载进程的退出状态等信息,供父进程收集。

点击此处
隐藏目录