[英]Swift on macOS: Running code on termination of background app
我正在編寫一個在后台作為守護進程運行的 Mac 應用程序。 如何檢測應用程序何時被終止並運行一些清理代碼? 我曾嘗試捕獲諸如SIGTERM
、 SIGINT
和SIGKILL
之類的信號,但我的應用程序結構似乎存在一些問題。
這是我的應用程序從主線程開始的基本流程:
func signalHandler(signal: Int32) { ... }
let signals = [SIGINT, SIGTERM, SIGKILL]
for sig in signals {
signal(sig, signalHandler)
}
// code to kick off background execution that will occasionally need to run some stuff on the main thread
RunLoop.current.run() // SIGTERM shows up in Xcode on this line, signalHandler not called
如果我使用 Xcode 的停止按鈕停止應用程序或從 Activity Monitor 強制退出,應用程序只會以退出代碼 9 ( SIGKILL
) 退出。 如果我從活動監視器中選擇“退出”,應用程序會收到一個SIGTERM
但不會調用處理程序... Xcode 只是突出顯示RunLoop
行並說Thread 1: signal SIGTERM
。
如果沒有RunLoop
行,我的應用程序幾乎會立即停止,但我需要讓它保持活動狀態。 同時,我在想那條線可能會阻塞主線程並阻止信號處理程序運行。 有沒有辦法解決這個問題,以便我可以優雅地處理我的應用程序終止?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.