在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. 爲什麼程序退出?
- 3. 爲了不阻止VM退出,線程應該做些什麼?
- 4. 是什麼退出:做
- 5. 程序不會退出。如何找出python在做什麼?
- 6. 退出cobol運行時時出錯。我能做些什麼來修復它
- 7. SDL程序啓動後立即退出。我做錯了什麼?
- 8. 退出C程序
- 9. {}在C中做些什麼
- 10. 這些退出代碼對於MPI程序意味着什麼?
- 11. 程序爲什麼退出主循環?
- 12. 線程什麼時候退出?
- 13. C++/SFML程序在退出時崩潰
- 14. 爲什麼有些人在出錯時退出-1而不是退出1?
- 15. 爲什麼visual studio在應用程序退出時退出調試器?
- 16. break退出程序 - C++
- 17. 這個C程序是做什麼的?
- 18. 這是什麼(C/C++)程序在做什麼?
- 19. 當assert()失敗時,程序退出代碼是什麼?
- 20. 爲什麼這個python程序有時無法退出?
- 21. 爲什麼這個Java程序在退出時關閉?
- 22. 這些操作員在做什麼C
- 23. @end在Objective C中做了些什麼?
- 24. 爲什麼我在退出應用程序時遇到應用程序崩潰?
- 25. 這些線程爲什麼在完成工作之前退出?
- 26. 跳過程序做什麼?
- 27. 這個程序做什麼?
- 28. 這個程序做什麼?
- 29. 爲什麼應用程序退出這麼久?的Windows Mobile 6.5 C#
- 30. 當child_added完成時會做些什麼
現貨。謝謝。 – 2011-05-21 14:15:40
這不是一個解決方案。它不會保護您免受異常終止。 'atexit'函數在實踐中基本沒有用處,除了小程序永遠不會變大或變成圖書館之外,它的使用應該被認爲是有害的,因爲它必然涉及全局變量/全局狀態。 – 2011-05-21 14:54:42
你們都可能已經知道這一點,但網絡中斷和電源故障等事情可能會阻止這類代碼的運行。每隔'n'分鐘向數據庫寫入時間戳可能會更加健壯,並且在沒有時間戳記的'n + m'分鐘後讓數據庫清理廢棄的標記。 – 2011-05-21 14:56:39