1

假设我正在用纯 C 语言开发一个库。该库要求用户lib_init()在他们的程序开始时调用以使其工作。lib_init()将分配一些内存空间供自己使用(ctrl 变量、aa 列表、fifo 等)。

现在的问题是:有没有办法在程序完成后释放这些内容而不强制用户调用一些清理函数,比如lib_clean()or lib_finish()

要开发的库是一个线程操作库,类似于 POSIX 线程的廉价版本。我想知道是否有任何方法可以在 main 的返回点(跳转到清理函数)结束之前通过使用swapcontext(). 有什么想法吗?

4

2 回答 2

1

为什么你愿意做可怕的、危险的黑客行为来实现一些无用的东西?当程序终止时,根本不需要释放这些资源。当一个进程死亡时,它的所有资源都会随之消失。唯一需要采取任何显式操作的情况是,如果您创建的资源不是进程本地的,例如文件系统中的临时文件或 POSIX 或 SYSV 共享内存、信号量、消息队列等。但是,您确实应该设计你的应用程序要容忍这些资源被留下,因为用户/管理员总是可以用 强行杀死你的进程SIGKILL,在这种情况下你将无法清理。

如果您真的想要或需要在退出时清理资源,该atexit函数为您提供了正确的方法来执行此操作。但是,您应该注意确保您不会多次注册它,否则您可能会使事情变得更糟并通过释放已经释放的资源来调用未定义的行为。请注意,避免函数的双重初始化和双重注册atexit需要适当的同步,以防调用程序是多线程的并从多个位置调用 init 函数。您应该使用其中一个pthread_once或等效的逻辑与互斥锁来确保初始化(包括atexit注册)只发生一次。

于 2013-04-30T23:43:39.587 回答
0

我想atexit()应该能够做你想做的事。它注册了一个“回调”函数,该函数将在应用程序退出时(从返回main或被调用时exit())调用。CTRL如果应用程序崩溃(或用户按+中止程序等),它不会运行C,您将不得不实现信号处理程序来解决这个问题(这更棘手,因为给定信号只能有一个信号处理程序)。

于 2013-04-30T23:42:47.440 回答