簡體   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