在C中,如果我的应用程序意外结束,我可以在这之前调用函数吗?我正在向数据库写入一个标志(processRunning = 1),以防止其他应用程序启动类似的进程。当应用程序结束时,它不会将该标志改回。C:程序退出时做些什么
回答
查看C标准库的API atexit
。
如果您的应用程序正常终止,它将运行通过atexit
注册的函数。这是标准功能,可在Windows,unix和其他所有平台上获得,也可在C++中获得。
请注意,“正常终止”是指通过致电exit()
或从main()
返回。如果您的申请通过abort()
或_exit()
终止,或者如果它从外部被立即杀害,它可能没有机会做任何清理。可能会有更好的方法,可能会设置和清除包装程序中的标志,无论程序如何终止,或者完全取消该标志,都会进行清理。
感谢您的额外建议,Gilles。我正在考虑某事。类似于每隔几秒检查一次应用程序是否连接到特定PID的进程仍在运行。 – 2011-05-21 14:15:33
一个解决方案可能是涉及捕获信号。 (我认为这不适用于Windows。) – 2011-05-21 14:16:48
@Frank:当心PID检查并非万无一失。 PID可以被不相关的进程快速重用。 – Gilles 2011-05-21 14:17:41
有更好的方法来阻止应用程序运行两次。一种解决方案是使用系统范围内名为互斥体的。另一个也许更简单的解决方案是锁定一个文件(开放写入)。即使应用程序崩溃资源被操作系统释放,您将能够再次启动应用程序,因为文件或互斥锁不会再被锁定。
在POSIX上,正确的解决方案是使用共享内存中的强大互斥锁来保护数据。如果你的进程死于一个强大的互斥体,另一个试图锁定互斥体的程序将不会发生死锁,而是返回EOWNERDEAD
,然后它有机会清除由互斥体保护的状态并呼叫pthread_mutex_consistent
。
编辑:如果您只想防止程序的多个实例运行,那么确实有更好/更简单的方法,例如对数据库文件进行锁定。
+1不知道。谢谢,弗兰克 – 2011-05-21 15:15:29
- 1. 终止python程序时做些什么
- 2. 为了不阻止VM退出,线程应该做些什么?
- 3. 是什么退出:做
- 4. 程序不会退出。如何找出python在做什么?
- 5. 退出cobol运行时时出错。我能做些什么来修复它
- 6. 退出C程序
- 7. 这些退出代码对于MPI程序意味着什么?
- 8. 线程什么时候退出?
- 9. 为什么有些人在出错时退出-1而不是退出1?
- 10. 为什么visual studio在应用程序退出时退出调试器?
- 11. 这个C程序是做什么的?
- 12. 程序为什么要这样做? C++
- 13. 这是什么(C/C++)程序在做什么?
- 14. 为什么这个Java程序在退出时关闭?
- 15. 当assert()失败时,程序退出代码是什么?
- 16. 这个程序做什么?
- 17. 跳过程序做什么?
- 18. 当child_added完成时会做些什么
- 19. Text = NULL时能做些什么?
- 20. Xcode在索引时做些什么?
- 21. MsgBox关闭时做些什么
- 22. for循环结束时做些什么
- 23. Angular2 - 在innerHTML改变时做些什么
- 24. iOS:在收到UserNotification时做些什么?
- 25. 做些什么时,计数器= x
- 26. 程序退出时出现C++内存错误
- 27. 为什么Matlab独立应用程序退出时出现错误“TooManyOutputs”?
- 28. 当管道写入标准输出时,为什么write()管道退出程序?
- 29. c程序如何在退出时自动打印退出()返回值
- 30. QT/C++ QTableWidget:在双击标题时做些什么
现货。谢谢。 – 2011-05-21 14:15:40
这不是一个解决方案。它不会保护您免受异常终止。 'atexit'函数在实践中基本没有用处,除了小程序永远不会变大或变成图书馆之外,它的使用应该被认为是有害的,因为它必然涉及全局变量/全局状态。 – 2011-05-21 14:54:42
你们都可能已经知道这一点,但网络中断和电源故障等事情可能会阻止这类代码的运行。每隔'n'分钟向数据库写入时间戳可能会更加健壮,并且在没有时间戳记的'n + m'分钟后让数据库清理废弃的标记。 – 2011-05-21 14:56:39