你会用什么退出处理程序?

Joh*_*0te 5 c unix

可能重复:
atexit功能的目的是什么?

至少在UNIX中:我知道C/C++可以在main - exit处理程序的出口处注册一些要调用的函数.可以使用以下相反的顺序注册要调用的函数:

int atexit(void (*func) (void));
Run Code Online (Sandbox Code Playgroud)

我无法确定这将如何有用.函数是void/void和global,因此它们不太可能访问程序周围的许多变量,除非变量也是全局变量.有人能让我知道你会对退出处理程序做些什么吗?

另外,退出处理程序在非UNIX平台上的工作方式是否相同,因为它们是ANSI C规范的一部分?

Ale*_* C. 5

您可以在atexit处理程序中对全局对象执行清理:

static my_type *my_object;

static void my_object_release() { free(my_object); }

my_type *get_my_object_instance() 
{
    if (!my_object)
    {
        my_object = malloc(sizeof(my_type));
        ...
        atexit(my_object_release);
    }

    return my_object;
}
Run Code Online (Sandbox Code Playgroud)

如果您希望能够在类似atexit的处理程序中关闭某些变量,则可以设计自己的包含清理函数/参数对的数据结构,并注册一个调用所有所述函数及其相应参数的atexit处理程序.


APr*_*mer 5

退出处理程序允许库在没有主程序意识到需要的情况下进行关闭清理(因此是全局数据结构).我在退出处理程序中完成的两个例子:

  • 恢复tty标志

  • 正确关闭网络连接,以便对等方不必等待一段时间

你可能会想到其他用途.