All things are difficult before they are easy. 没有软件的裸机是一具僵尸,没有硬件的软件是一个幽灵。2012,专注于Linux和C语言,关注自动化、性能测试,关注开源社区和开源测试工具、方法,尝试测试团队管理!

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

上一篇 / 下一篇  2011-04-30 23:15:05 / 个人分类:C/C++

在C/C++程序中,在main函数的return之后,还是可以执行一些特定的函数,我们可以用atexit()来注册需要在程序终止时调用的函数。还是先看看下面的例子吧(C/C++ 代码):
* atexit example */
#include <stdio.h>
#include <stdlib.h>

void fnExit1 (void)
{
    puts ("Exit function 1.");
}

void fnExit2 (void)
{
    puts ("Exit function 2.");
}

int main ()
{
    atexit (fnExit1);
    atexit (fnExit2);
    puts ("Main function.");
    return 0;
}

很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit()结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就是用atexit()函数来注册程序正常终止时要被调用的函数。

atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。
atexit()的函数原型是:
#include <cstdlib>
intatexit(void(*func)(void));
atexit()成功时返回零,失败时返回非零。

在一个程序中至少可以用atexit()注册32个处理函数(你至少可以32次,这依赖于你的编译器),这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。
这里需要纠正一下网上很多人的错误说法,他们说atexit()最多可以被调用32次,而实际上是atexit最少可以被调用32次。可以见C99规范中对atexit()函数的描述:

From "ISO/IEC 9899:1999 (E)":
7.20.4.2 The atexit function
Synopsis
1 #include <stdlib.h>
int atexit(void (*func)(void));
Description
2 The atexit function registers the function pointed to by func, to be
called without arguments at normal program termination.
Environmental limits
3 The implementation shall support the registration of at least 32
functions.
Returns
4 The atexit function returns zero if the registration succeeds,
nonzero if it fails.


关于atexit函数更详细的说明:
http://www.cplusplus.com/reference/clibrary/cstdlib/atexit/

C99规范可以从这里下载:
http://ishare.iask.sina.com.cn/f/7751242.html

相关阅读:

TAG: atexit exit main

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

smile665

smile665

Stay hungry, stay foolish. 得意之时谨记,一半命运还掌握在上帝手里;失意之时须知,一半命运还掌握在自己手里。

日历

« 2020-02-25  
      1
2345678
9101112131415
16171819202122
23242526272829

数据统计

  • 访问量: 748927
  • 日志数: 220
  • 建立时间: 2008-11-06
  • 更新时间: 2012-10-06

RSS订阅

Open Toolbar