[英]Trapping signals in a Swift command line application
如何正確捕獲 Swift 中的SIGINT
和SIGTERM
等不同信號? 例如,當人們通過按Control - C停止我的腳本時,我想在終止它之前進行一些清理。
調度源可用於監視 UNIX 信號。
這是一個簡單的示例,即並發編程指南的“監控信號”部分中的 C 代碼的 Swift 3 翻譯。
import Dispatch // or Foundation
signal(SIGINT, SIG_IGN) // // Make sure the signal does not terminate the application.
let sigintSrc = DispatchSource.makeSignalSource(signal: SIGINT, queue: .main)
sigintSrc.setEventHandler {
print("Got SIGINT")
// ...
exit(0)
}
sigintSrc.resume()
請注意,這需要一個活動的 GCD 事件循環,例如
dispatchMain()
在命令行程序中。
我使用更簡單的方法。 在main.swift
中執行任何代碼之前,只需通過這些行:
let signalCallback: sig_t = { signal in
NSLog("Got signal: \(signal)")
exit(signal)
}
signal(SIGINT, signalCallback)
不過有一個限制。 您只能從signalCallback
訪問全局范圍的事物。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.