(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;}结果:
新闻热点
疑难解答