在C中,如果我的应用程序意外结束,我可以在此之前调用函数吗?我正在向数据库(processRunning = 1)写入一个标志,以阻止其他应用程序启动类似的进程。当应用程序结束时,它不会改变该标志。
答案 0 :(得分:6)
查看C标准库的atexit
API。
答案 1 :(得分:5)
在POSIX上,正确的解决方案是使用共享内存中的强大互斥锁来保护数据。如果您的进程因持有强大的互斥锁而死亡,另一个试图锁定互斥锁的程序将不会死锁,而是返回EOWNERDEAD
,然后它有机会清除受互斥锁保护的状态并调用{{ 1}}。
编辑:如果你只想阻止程序的多个实例运行,肯定有更好/更简单的方法,比如对数据库文件进行锁定。
答案 2 :(得分:4)
如果您的应用程序正常终止,它将运行通过atexit
注册的功能。这是一个标准功能,可在Windows,unix和其他所有平台以及C++中使用。
请注意,“正常终止”表示通过调用exit()
或从main()
返回。如果您的应用程序通过abort()
或_exit()
终止,或者如果它是从外部立即终止的,则可能没有机会进行任何清理。可能有一种更好的方法,可能在包装器程序中设置和清除标志,无论程序如何终止,或者完全取消该标志,它都会进行清理。
答案 3 :(得分:2)
有更好的方法可以阻止应用程序运行两次。一种解决方案是使用系统范围的命名互斥锁。另一个也许更简单的解决方案是锁定文件(打开以进行写入)。即使应用程序崩溃资源被操作系统释放,您也可以再次启动应用程序,因为文件或互斥锁将不再被锁定。