[英]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.