繁体   English   中英

在 Swift 命令行应用程序中捕获信号

[英]Trapping signals in a Swift command line application

如何正确捕获 Swift 中的SIGINTSIGTERM等不同信号? 例如,当人们通过按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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM