Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 您使用退出处理程序的目的是什么?_C_Unix - Fatal编程技术网

C 您使用退出处理程序的目的是什么?

C 您使用退出处理程序的目的是什么?,c,unix,C,Unix,可能重复: 至少在UNIX中:我知道C/C++可以注册许多函数,以便在主出口处理程序的出口处调用。要调用的函数可以使用以下方法按相反顺序注册: int atexit(void (*func) (void)); 不过,我很难确定这是否有用。这些函数是void/void和global,因此它们不太可能访问程序中的许多变量,除非这些变量也是全局变量。有人能告诉我你会用出口处理程序做什么吗 此外,退出处理程序在非UNIX平台上的工作方式是否相同,因为它们是ANSI C规范的一部分?您可以在atexi

可能重复:

至少在UNIX中:我知道C/C++可以注册许多函数,以便在主出口处理程序的出口处调用。要调用的函数可以使用以下方法按相反顺序注册:

int atexit(void (*func) (void));
不过,我很难确定这是否有用。这些函数是void/void和global,因此它们不太可能访问程序中的许多变量,除非这些变量也是全局变量。有人能告诉我你会用出口处理程序做什么吗


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

您可以在
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处理程序,用相应的参数调用所有上述函数。

阅读以下博客文章:

当一个程序终止时,它需要做一些收尾工作 例如,将数据保存到将在下一个会话中使用的文件中。在里面 每个程序都有一组特定的事情要做,这取决于 出于程序目的(关闭时)。做过这样的事吗 由一个函数完成,该函数的指针将是 atexit函数

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


阅读更多信息:

退出处理程序允许库在主程序不知道需要的情况下进行关机清理(从而清除全局数据结构)。我在退出处理程序中完成的两个示例:

  • 恢复tty标志

  • 正确关闭网络连接,使对等方不必等待超时


您可能可以考虑其他用途。

atexit处理程序解决的最明显问题是整理全局对象。这是一个C特性,当然C没有像C++那样自动解除分配。如果您可以访问
main
的实现,您可以编写自己的此类代码,但在其他方面
atexit
可能会有帮助。

用于释放内存。等等。好问题!1)生成代码(思考<代码> ATUT(Run-StasyAsDebug);< /COD>)2)示例代码(<代码> ATSUT(SDLXOUT);< /COD>)3)在后面的代码中与调用代码>退出>代码的接口连接,还有一个问题-它在C++中还是有用的吗?还是有点被贬低了?我认为你可以在C++中使用RAII。代码> ATEX/<代码>非常un-c++。C++中的“代码> >退出<代码>有“有效”用法。释放一个单例实例就是一个例子。回顾我的答案,我意识到由于操作系统在程序退出时清理内存,所以不需要使用
atexit
。但是,它对其他资源很有用,如关闭网络连接、清理临时文件、保存程序状态等。在我看来,@AProgrammer给出的答案更好。你可能是对的,不需要释放,因为程序已经终止并释放了所有内容,对不对?@turmuka:Yes,返回内存并关闭打开的文件。不过,在程序退出时,您可能还需要做其他事情。在检查IO错误时关闭文件(通常很棘手),或正确关闭远程连接等。atexit可用于关闭网络连接以保持稳定性。