C:程序退出时做某事

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

查看C标准库的atexit API。

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

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

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

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

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