C:程序退出时执行某些操作

时间:2011-05-21 14:05:17

标签: c exit

在C中,如果我的应用程序意外结束,我可以在此之前调用函数吗?我正在向数据库(processRunning = 1)写入一个标志,以阻止其他应用程序启动类似的进程。当应用程序结束时,它不会改变该标志。

4 个答案:

答案 0 :(得分:6)

查看C标准库的atexit API。

答案 1 :(得分:5)

在POSIX上,正确的解决方案是使用共享内存中的强大互斥锁来保护数据。如果您的进程因持有强大的互斥锁而死亡,另一个试图锁定互斥锁的程序将不会死锁,而是返回EOWNERDEAD,然后它有机会清除受互斥锁保护的状态并调用{{ 1}}。

编辑:如果你只想阻止程序的多个实例运行,肯定有更好/更简单的方法,比如对数据库文件进行锁定。

答案 2 :(得分:4)

如果您的应用程序正常终止,它将运行通过atexit注册的功能。这是一个标准功能,可在Windowsunix和其他所有平台以及C++中使用。

请注意,“正常终止”表示通过调用exit()或从main()返回。如果您的应用程序通过abort()_exit()终止,或者如果它是从外部立即终止的,则可能没有机会进行任何清理。可能有一种更好的方法,可能在包装器程序中设置和清除标志,无论程序如何终止,或者完全取消该标志,它都会进行清理。

答案 3 :(得分:2)

有更好的方法可以阻止应用程序运行两次。一种解决方案是使用系统范围的命名互斥锁。另一个也许更简单的解决方案是锁定文件(打开以进行写入)。即使应用程序崩溃资源被操作系统释放,您也可以再次启动应用程序,因为文件或互斥锁将不再被锁定。