【问题标题】:Trapping signals in a Swift command line application在 Swift 命令行应用程序中捕获信号
【发布时间】:2018-01-24 14:41:25
【问题描述】:

如何在Swift中正确捕获SIGINTSIGTERM等不同的信号?例如,当人们通过按 Control-C 停止我的脚本时,我想在终止它之前进行一些清理。

【问题讨论】:

    标签: swift signals


    【解决方案1】:

    Dispatch Sources 可用于监控 UNIX 信号。

    这是一个简单的例子,一个 Swift 3 翻译的 C 代码在 并发编程指南中的"Monitoring Signals" 部分。

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

    在命令行程序中。

    【讨论】:

    • 记得import Dispatch
    • @paper1111:你是对的。它对我有用,因为我的测试代码已经导入了 Foundation。
    • 对我不起作用,eventHandler 永远不会被调用。整个程序需要在DispatchQueue.main运行吗?
    • @M.J.K:是的。正如我所说,它需要一个活跃的 GCD 事件循环。
    • 对不起,如果我遗漏了一些基本的东西,但是当所有代码都在主函数中时为什么这会起作用,但是如果我尝试在类 init 中注册信号处理程序并运行主函数中的dispatchMain,程序在sigint上永远阻塞?
    猜你喜欢
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多