Trapping signals in a Swift command line application
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.
Solution 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.