反向注册函数atexit()

atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数

函数原型:int atexit (void (*)(void))

exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件,最后调用_exit系统函数。

⼀一个进程可以登记若32个函数,这些函数由exit自动调用,这些函数被称为终止处理函数,atexit函数可以登记这些函数。exit调用终止处理函数的顺序和atexit登记的顺序相反,如果一个函数被多次登记,也会被多次调用 。

 

#include<stdio.h>
#include<stdlib.h>
void fun1()
{

    printf("fun1\n");
}

void fun2()
{
     printf("fun2\n");

}

int main(int argc,char**argv)
{

        atexit(fun1);//先注册fun1
        atexit(fun2);//再注册fun2
        printf("start return\n");

       exit (0);
}
pi@raspberrypi:~/luoyiran/proc $ gcc atexit.c 
pi@raspberrypi:~/luoyiran/proc $ ./a.out      
start return
fun2
fun1

 先打印start,再依次打印fun2,fun1
如果main函数中printf部分不加\n,则main函数要输出的内容会先放到标准输出缓冲区中,睡眠5秒后再打印出来,当main中调用exit函数的时候,会做一些自身清理工作,同时刷新标准输出缓冲区中的内容,当执行到exit(0)时,exit会自动调用已注册过的函数,但是由于压栈过程中先进后出的原则,所以先注册的函数最后执行。

如果一个函数被atexit()登记多次也会被exit()调用多次。 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页