atexit()函数注册机制及调用次序

2017-04-21 10:42 阅读 580 次 评论 0 条

atexit()的原型

atexit的函数原型如下:可以看出它是一个函数指针,里面存放的是函数的地址,当调用此函数时无须传递任何参数,该参数也不能有返回值。

atexit()的作用

在标准库中有这样的描述:

翻译过来的意思就是:当程序正常终止时,atexit函数传递要调用的函数(func)的地址。 对atexit的连续调用创建一个在LIFO(先进先出)命令中执行的功能寄存器。 传递给atexit的函数不能有参数。 atexit和_onexit使用堆来保存函数的寄存器。 因此,可以注册的功能数量仅受堆存储器限制。

atexit()的调用次序

你会发现,首先调用的是main,说明atexit是在进程退出的时候,调用曾经注册过的函数,即atexit在退出前会进行注册,退出时进行回调。

atexit可以注册多个函数,调用多个函数时,它的调用顺序并不是调用次序,而是压栈次序,即先进后出。如果一个函数被多次登记,也会被多次调用。

atexit()注册限制

按照ISO C的规定,一个进程可以登记32个函数,这些函数由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数。

下面我们验证一下,看是否有限制,我们沿用上述程序,注册35个函数:

其实是可以注册成功的。atexit()所能注册的函数是受堆寄存器唯一控制的,并不是一成不变的。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:atexit()函数注册机制及调用次序 | 术与道的分享
分类:操作系统 标签:, ,
1024do.com导航_术与道导航平台

发表评论


表情