五种进程正常终止方式:
- 从main返回
- 调用exit,其操作包括调用各终止处理程序,然后关闭所有标准I/O流等。
- 调用_exit或者_Exit,在unix系统中这两个函数是同义的,并不冲洗I/O流,_exit函数为进程提供一种无需运行终止处理程序或信号程序而终止的方法。
- 最后一个线程从其启动例程中执行return返回
- 从最后一个线程调用pthread_exit
三种异常进程终止方式:
- 调用abort
- 接收到一个信号
- 最后一个线程对于取消请求做出响应
对于3个终止函数(exit,_exit,_Exit),实现这一点的方法是将其退出状态作为参数传递给函数。
在异常终止情况,内核产生一个指示其异常终止原因的终止状态。
1 退出函数
下面三个函数用于正常终止一个程序,_exit和_Exit立即进入内核,exit则先执行一些清理处理,然后返回内核。
#include <stdlib.h>
void exit(int status);//由于历史原因该函数会执行标准I/O库的清理关闭操作,对所有打开流调用fclose函数
void _Exit(int status);
#include <unistd.h>
void _exit(int status);
上面三个函数的整形参数称为终止状态。
2.函数atexit
#include <stdlib.h>
int atexit(void (*func)(void));
//成功返回0,出错返回非0
example:
#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);
int main()
{
if(atexit(my_exit2)!=0)
err_sys("cann't register my_exit2\n");
if(atexit(my_exit1)!=0)
err_sys("cann't register my_exit01\n");
if(atexit(my_exit1)!=0)
err_sys("cann't register my_exit01\n");
printf("main is done\n");
return 0;
}
static void my_exit1()
{
printf("first exit handler\n");
}
static void my_exit2()
{
printf("second exit handler\n");
}
执行结果:
注意:atexit函数执行顺序和注册顺序相反
以上内容来源于网络,仅作本人学习笔记使用,关于本书请参考APUE