进程终止(UNIX环境高级编程笔记)
有8种方式使进程终止(termination),其中5种为正常终止,它们是:
(1)从main返回;
(2)调用exit;
(3)调用_exit或_EXIT;
(4)最后一个线程从其启动例程返回;
(5)从最后一个线程调用pthread_exit。
异常终止有3中方式:
(6)调用abort;
(7)接到一个信号;
(8)最后一个线程对取消请求做出响应。
退出函数
3个函数用于正常终止一个程序:_exit和_EIXT立即进入内核,eixt则先执行一些清理处理再返回内核。
#include <stdlib.h> void exit(int status); void _EXIT(int status); #include <unistd.h> void _exit(int status); |
---|
由于历史原因,exit函数总是执行一个标准I/O库的清理关闭操作:对所有打开流调用fclose函数。这造成所有输出缓冲流中的所有函数中的所有数据都被冲洗(写到文件上)。
3个退出函数都带一个整形参数,称为终止状态(或退出状态,exit status)。大多数UNIX系统shell都提供给检查进程终止状态的方法(echo $?)。
main函数返回一个整型值与用该值调用exit是等价的。
2.函数atexit
按照ISO C的规定,一个进程最多可以登记32个函数,这些函数将由exit自动调用。我们称这些函数为终止处理程序(exit handler),并调用atexit函数来登记这些函数。
#include <stdlib.h> int atexit(void (*func)(void)); 返回值:若成功,返回0;若出错,返回非0 |
---|
其中atexit的参数是一个函数地址,当调用函数时无需向它传递任何参数,也不期望它返回一个值。exit调用这些函数的顺序与它们登记时候的顺序相反。同一函数若登记多次,也将执行多次。
根据ISO C和POSIX.1,exit首先调用各终止处理程序,然后通过fclose关闭所有打开的流。下图显示了一个C程序是如何启动的,以及它终止的各种方式。