exit函数与僵尸进程
在UNIX中,有三个函数用于正常终止一个程序
#include<stdlib.h>
void exit(int status)
void _Exit(int status)
#include<unistd.h>
void _exit(int status)
其中前两个是由ISO C说明,而第三个由POSIX.1说明,也就是说前两个是库函数,而第三个是系统调用。
exit函数总是会执行一个标准I/O库的清理关闭工作,为所有打开的流调用fclose函数,这会造成所有的缓冲的输出数据都被冲洗.
这三个函数的参数都代表了当前进程的终止状态。
当然,进程也可能以非正常状态终止。比如收到一个SIGABRT信号等。
不管进程是如何终止的,内核都会为进程进行一些清理工作,关闭文件描述符,释放存储器等。
不论任何情况,父进程都应该能够知道子进程是如何终止的,这可以通过调用wait或waitpid函数取得其终止状态等信息。
如果子进程没终止,父进程先终止了,会怎样呢?init进程会“领养”这些子进程,这种方法保证每个进程都有一个父进程。
如果子进程终止了,父进程没终止呢?内核必须还为该进程保存一些信息,因为父进程有可能会需要这些信息,这些信息包括进程ID,终止状态,CPU时间总量等,但是终止的子进程中的文件描述符和内存均已释放
UNIX术语中,一个已经终止,但父进程没有对其进行善后处理(获取子进程的相关信息)称为僵死进程。
避免出现僵死进程的方法是,调用wait或者waitpid函数取得子进程终止状态,或将SIGCHLD信号忽略。
被init进程领养的子进程不会变为僵尸进程,init会逐一调用wait取得其终止状态。