(1)exit() _exit() _Exit()
#include <stdlib.h>: void exit( int status ); void _Exit( int status );
#include <unistd.h>: void _exit( int status );
在图1中可以看出:这三个函数⽤用于正常终⽌止⼀一个程序,_exit和_Exit⽴立即进⼊入内核,而exit则要先做⼀一些清理⼯工作(调⽤用执⾏行各终⽌止处理程序,刷新所有输出流,关闭所有标准I/O流),再进⼊入内核。三个函数所带的整型参数称为终⽌止状态或退出状态。
下面写个小代码测试一下:
利用printf函数的行缓存方式,遇到“\n”换行符自动从缓存区读出记录
测试exit函数: 测试结果:
分析:由于exit会刷新输出流,所以第二个printf的内容会显示
测试_exit()函数同理_Exit函数 测试结果:
分析:_exit()函数不会输出第二个printf的内容
atexit()函数:
如果需要在main退出后再执行一段代码,可以使用atexit()函数注册一个函数。
atexit()函数介绍:
函数原型:int atexit( void (*fun)( void ) );
头文件:#include<stdlib.h>
功能: 注册终止函数(即main执行结束后调用的函数)
注意:按照ISO C的规定,一个进程中最多可以用atexit()注册32个处理函数,这些函数将由exit自动调用。atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们 注册时候的顺序相反,也即最先注册的最后调用,最后注册的最先调用。同一个函数如若登记多次,则也会被调用多次。
当调用fork时,子进程继承父进程注册的atexit;
当atexit注册的函数中有一个没有正常返回或被kill,则后续的注册函数都不会被执行;
代码演示:
#include<stdio.h>
#include<stdlib.h>
void fun1()
{
printf("this is fun1\n");
}
void fun2()
{
printf("this is fun2\n");
}
void fun3()
{
printf("this is fun3\n");
}
int main()
{
atexit(fun1);
atexit(fun2);
atexit(fun3);
return 0;
}
结果: