【发布时间】:2018-01-24 14:41:25
【问题描述】:
如何在Swift中正确捕获SIGINT和SIGTERM等不同的信号?例如,当人们通过按 Control-C 停止我的脚本时,我想在终止它之前进行一些清理。
【问题讨论】:
如何在Swift中正确捕获SIGINT和SIGTERM等不同的信号?例如,当人们通过按 Control-C 停止我的脚本时,我想在终止它之前进行一些清理。
【问题讨论】:
Dispatch Sources 可用于监控 UNIX 信号。
这是一个简单的例子,一个 Swift 3 翻译的 C 代码在 并发编程指南中的"Monitoring Signals" 部分。
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()
在命令行程序中。
【讨论】:
import Dispatch!
DispatchQueue.main运行吗?