Trapping signals in a Swift command line application

前端 未结 1 1424
没有蜡笔的小新
没有蜡笔的小新 2020-11-30 12:49

How to capture different signals such as SIGINT and SIGTERM in Swift correctly? For example, when people stop my script by pressing Control

相关标签:
1条回答
  • 2020-11-30 13:36

    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.

    0 讨论(0)
提交回复
热议问题