1. 进程终止方式:
有 8 种方式使进程终止(termination),其中 5 种为正常终止,他们是
(1)从 main 函数返回。
(2)调用 exit。
(3)调用 _exit 或 _Exit。
(4)最后一个线程从其启动例程返回。
(5)最后一个线程调用 pthread_exit。
异常终止有 3 种方式,它们是
(6)调用 abort。
(7)接到一个信号并终止。
(8)最后一个线程对取消请求做出响应。
2. exit、 _Exit 和 _exit 函数。
这三个函数用于正常终止一个程序:_exit 和 _Exit 立即进入内核, exit 则先执行一些清理处理(包括调用执行各终止处理程序(exit handler), 清理和关闭所有标准I/O 流等),然后进入内核。
#include <stdlib.h> /* ISO C 中说明 */ void exit(int status); void _Exit(int status);
#include <unistd.h> /* POSIX.1 中说明 */ void _exit(int status);
|
3. atexit 函数。
按照 ISO C 的规定,一个进程可以登记多达32个函数,这些函数将由 exit 自动调用。一般称这些函数为终止处理程序(exit handler),并调用 atexit 函数来登记这些函数。
#include <stdlib.h> int atexit(void (*func)(void)); Returns: 0 if OK, nonzero on error
|
exit 调用这些函数的顺序与它们登记时候的顺序相反。同一个函数如若登记多次,则也会被调用多次。
4. 一个 C 程序的启动和停止:
根据 ISO C 和 POSIX.1 , exit 首先调用各终止处理程序,然后按需多次调用 fclose,关闭所有打开流。POSIX.1 扩展了ISO C标准,它指定如若程序调用 exec 函数族中的任一函数,则将清除所有已安装的终止处理程序。
下图显示了一个 C 程序是如何启动的,以及它可以终止的各种方式。
注意: 内核是程序执行的唯一方法是调用一个exec 函数。进程自愿终止的唯一方式是显示或隐式地(通过调用 exit)调用_exit 或 _Exit。进程也可非自愿地由一个信号使其终止(上图中没有显示)。
阅读(1725) | 评论(0) | 转发(0) |