【发布时间】:2011-05-21 14:05:16
【问题描述】:
在 C 语言中,如果我的应用程序意外结束,我可以在此之前调用一个函数吗?我正在将一个标志写入数据库(processRunning = 1),以防止其他应用程序启动类似的进程。当应用程序结束时,它不会改变那个标志。
【问题讨论】:
在 C 语言中,如果我的应用程序意外结束,我可以在此之前调用一个函数吗?我正在将一个标志写入数据库(processRunning = 1),以防止其他应用程序启动类似的进程。当应用程序结束时,它不会改变那个标志。
【问题讨论】:
查看 C 标准库的 atexit API。
【讨论】:
atexit 函数在实践中基本上是无用的,除了在永远不会变大或变成库的小程序中,它的使用可能应该被认为是有害的,因为它必然涉及全局变量/全局状态。
在 POSIX 上,正确的解决方案是在共享内存中使用强大的互斥锁来保护数据。如果您的进程因持有一个健壮的互斥锁而死,另一个试图锁定互斥锁的程序不会死锁,而是返回EOWNERDEAD,然后它有机会清理受互斥锁保护的状态并调用pthread_mutex_consistent。
编辑:如果您只想阻止程序的多个实例运行,肯定有更好/更简单的方法,例如锁定数据库文件。
【讨论】:
【讨论】:
有更好的方法可以防止应用程序运行两次。一种解决方案是使用系统范围的命名互斥体。另一种可能更简单的解决方案是锁定文件(打开以供写入)。即使应用程序崩溃资源被操作系统释放并且您将能够再次启动应用程序,因为文件或互斥体将不再被锁定。
【讨论】: