终止处理程序实例

预备知识:
1.   C语言中使用静态函数的好处:
      1)静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
     2) 关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限 于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
2.很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。

    atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:int atexit (void (*)(void));

    在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。


下面通过一个程序来说明:


#include <stdio.h> //for printf,perror

#include <stdlib.h> //for exit


static void exit1(void)
{
    printf("first exit handler\n");    
}

static void exit2(void)
{
    printf("second exit handler\n");    
}

int main(void)
{
    if(atexit(exit1) != 0)
    {
        perror("Can't register exit1");
        exit(1);    
    }    
    if(atexit(exit1) != 0)
    {
        perror("Can't register exit1");
        exit(1);    
    }
    if(atexit(exit2) != 0)
    {
        perror("Can't register exit2");
        exit(1);    
    }
    printf("main function is done.\n");
    
    exit(0);
}

编译运行程序:
obe-240 test/linuxc> gcc -o atexit atexit.c
obe-240 test/linuxc> ./atexit
main function is done.
second exit handler
first exit handler
first exit handler

作者: longmenyu   发布时间: 2010-12-24