Trapping signals in a Swift command line application

僤鯓⒐⒋嵵緔 提交于 2019-11-26 14:37:43

问题


How to capture different signals such as SIGINT and SIGTERM in Swift correctly? For example, when people stop my script by pressing Control-C, I want to do some cleanup before terminating it.


回答1:


Dispatch Sources can be used to monitor UNIX signals.

Here is a simple example, a Swift 3 translation of the C code in the "Monitoring Signals" section from the Concurrency Programming Guide.

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()

Note that this requires an active GCD event loop, e.g. with

dispatchMain()

in a command-line program.



来源:https://stackoverflow.com/questions/45713819/trapping-signals-in-a-swift-command-line-application

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!