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

时间:2011-08-31 19:24:15

标签: c unix

  

可能重复:
  what is the purpose of atexit function?

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

int atexit(void (*func) (void));

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

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

4 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:5)

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

  • 恢复tty标志

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

您可能会想到其他用途。

答案 2 :(得分:2)

atexit处理程序解决的最明显的问题是对全局对象进行整理。这是一个C功能,当然C没有像C ++那样的自动释放。如果您可以访问main的实现,则可以编写自己的代码,但atexit可能会有所帮助。

答案 3 :(得分:1)

Start and Termination in C++上阅读此博文:

  

当一个程序终止时,它需要做一些收尾工作   比如将数据保存到将在下一个会话中使用的文件中。在   这个灯每个程序都有一组特定的事情要做   在程序的目的(关闭时)。完成任何这样的事情   由指针作为参数的函数之一完成   atexit功能。

     

atexit函数的目的是注册(记录在内存中)   这些最后润色的功能。当atexit功能   使用任何指向这些函数的指针作为参数执行   指向功能已注册。这必须在C ++之前完成   程序到达终止阶段。

了解详情:http://www.bukisa.com/articles/356786_start-and-termination-in-c#ixzz1WdWVl4TF