首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带着问题看源码 —— exit 如何调用 atexit 处理器

glibc exit 之前写过一篇介绍 linux 进程环境的文章(《 [apue] 进程环境那些事儿》),其中提到了 glibc exit 会主动调用 atexit 注册的处理器,且有以下特性: LIFO...,先进后出的顺序 注册几次调用几次 atexit 处理器中再次调用 exit 能完成剩余处理器的调用 atexit 处理器中再次注册的 atexit 处理器能被调用 下面带着这些问题,来看 glibc...* arg) :__on_exit 注册的函数,与 atexit 的不同之处仅在于回调时多了一个 status 参数 void (*cxa) (void *arg, int status) :__internal_atexit...也是通过调用 __cxa_atexit 实现的: int atexit (void (*func) (void)) { return __cxa_atexit ((void (*) (void...); ret = atexit (bye); if (ret !

17710
您找到你想要的搜索结果了吗?
是的
没有找到

CC++程序终止时执行的函数——atexit()函数详解

方法就是用atexit()函数来注册程序正常终止时要被调用的函数。   atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。...atexit()的函数原型是:#include intatexit(void(*func)(void));atexit()成功时返回零,失败时返回非零。   ...在一个程序中至少可以用atexit()注册32个处理函数(你至少可以32次,这依赖于你的编译器),这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。...这里需要纠正一下网上很多人的错误说法,他们说atexit()最多可以被调用32次,而实际上是atexit最少可以被调用32次。   函数说明:atexit()用来设置一个程序正常结束前调用的函数....\n");}main(){    atexit (my_exit);    exit(0);}   执行:before exit()!

1.8K20

C语言main()主函数执行完毕后是否会再执行一段代码

: 一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数,atexit的参数是一个函数地址,当调用此函数时无须传递任何参数...,该函数也不能返回值,atexit函数称为终止处理程序注册程序,注册完成以后,当函数终止是exit()函数会主动的调用前面注册的各个函数,但是exit函数调用这些函数的顺序于这些函数登记的顺序是相反的,...atexit() 用于注册终止函数(即main执行结束后调用的函数),其原型为: int atexit(void (*function)(void)); 很多时候我们需要在程序退出的时候做一些诸如释放资源的操作...方法就是用atexit()函数来注册程序正常终止时要被调用的函数。 atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。...exit()函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。

1.6K50

C++反汇编第二讲,不同作用域下的构造和析构的识别

E3代理含义:   明白其上面的 atexit函数的原理,那么现在看看其E3内部的实现 ?...E3内部其实是将E2函数注册进了atexit函数,当结束的时候则会调用E2 那么现在看看E2 E2函数内部: ?...答:   因为atexit的参数的c约定回调,而析构是thiscall,调用约定,所以内部必须包含一层才可以....函数正常运行而注册的(atexit和ininterm类似,一个从前往后,一个从后往前)   6.E2是E3内部给atexit函数注册的回调,这样在析构的时候则调用E2即可.   7.E2函数内部是真正的调用析构的...实战中反汇编查找全局对象 既然我们知道了atexit函数会调用析构,那么我们在IDA中搜索atexit函数,看看谁引用了它,则可以把全局对象一网打尽. ? ?

1.1K100

C语言的main函数解析

main函数之后执行的函数 1、全局对象的析构函数会在main函数之后执行; 2、用atexit注册的函数也会在main之后执行。...atexit函数 原形: int atexit(void (*func)(void));  atexit 函数可以“注册”一个函数,使这个函数将在main函数正常终止时被调用,当程序异常终止时,通过它注册的函数并不会被调用...main()同样也是一个函数,在结束时,按出栈的顺序调用使用atexit函数注册的,所以说,函数atexit是注册的函数和函数入栈出栈一样,是先进后出的,先注册的后执行。...通过atexit可以注册回调清理函数。可以在这些函数中加入一些清理工作,比如内存释放、关闭打开的文件、关闭socket描述符、释放锁等等。...注册的函数的执行顺序:先注册的后执行     atexit( fn0 );       atexit( fn1 );       atexit( fn2 );       atexit( fn3 );

2.5K88

Linux系统下进程编程(一)

3、使用atexit注册进程终止处理函数,我们使用man手册来查看它的介绍: int atexit(void(*func)(void)); 注意:atexit()注册的函数类型应为不接受任何参数的void...函数,atexit的参数是一个函数地址(或者说是一个函数指针),当调用此函数(指的是atexit的参数 )时无须传递任何参数,该函数也不能返回值,atexit函数称为终止处理程序注册程序,注册完成以后。...\n"); // 当进程被正常终止时,系统会自动调用这里注册的func1执行 atexit(func2); atexit(func1); return 0; } 注:这里还有一点要注意的地方就是...return、exit和_exit的区别:return和exit效果一样,都是会执行进程终止处理函数,但是用_exit终止进程时并不执行atexit注册的进程终止处理函数(类似于单片机的中断)。...\n"); // 当进程被正常终止时,系统会自动调用这里注册的func1执行 atexit(func2); atexit(func1); printf("i like the rtos\n");

2.4K10

干货 | 深度剖析C语言的main函数

main函数之后执行的函数 1、全局对象的析构函数会在main函数之后执行; 2、用atexit注册的函数也会在main之后执行。...atexit函数 原形: int atexit(void (*func)(void)); atexit 函数可以“注册”一个函数,使这个函数将在main函数正常终止时被调用,当程序异常终止时,通过它注册的函数并不会被调用...main()同样也是一个函数,在结束时,按出栈的顺序调用使用atexit函数注册的,所以说,函数atexit是注册的函数和函数入栈出栈一样,是先进后出的,先注册的后执行。...通过atexit可以注册回调清理函数。可以在这些函数中加入一些清理工作,比如内存释放、关闭打开的文件、关闭socket描述符、释放锁等等。...注册的函数的执行顺序:先注册的后执行 atexit( fn0 ); atexit( fn1 ); atexit( fn2 ); atexit( fn3 );

1.7K40
领券