应用程序上下文:修改main()的返回点

时间:2013-04-30 23:36:27

标签: c linux

假设我正在使用普通的C开发一个库。该库要求用户在程序开始时调用lib_init()以使其正常工作。 lib_init()将为它自己使用(ctrl变量,列表,fifo等)分配一些内存空间。

现在的问题是:有没有办法在程序结束后释放此内容而不强迫用户调用某些清理功能,如lib_clean()lib_finish()

要开发的库是一个线程操作库,类似POSIX线程的廉价版本。我想知道是否有任何方法可以通过使用swapcontext()进行一些聪明的上下文操作来修改main的返回点(跳转到清理函数)。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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