APIDoc Build Status - Master macOS iOS Linux Apache 2 Slack Status

信号

通用的跨平台信号处理程序。

先决条件

Swift

BlueSignals 2.0 及以上版本支持 Swift 5.1+。请查看 BlueSSLService 的旧版本以获取旧版本的 Swift。

macOS

iOS

Linux

构建

要从命令行构建 Signals

% cd <path-to-clone>
% swift build

使用 Signals

包含在您的项目中

Swift Package Manager

要将 BlueSignals 包含到 Swift Package Manager 包中,请将其添加到 Package.swift 文件中定义的 dependencies 属性中。您可以使用 majorVersionminor 参数选择版本。例如

	dependencies: [
		.Package(url: "https://github.com/Kitura/BlueSignals.git", majorVersion: <majorVersion>, minor: <minor>)
	]

Carthage

要使用 Carthage 将 BlueSignals 包含到项目中,请在您的 Cartfile 中添加一行,其中包含 GitHub 组织和项目名称以及版本。例如

	github "Kitura/BlueSignals" ~> <majorVersion>.<minor>

CocoaPods

要使用 CocoaPods 将 BlueSignals 包含到项目中,只需将 BlueSignals 添加到您的 Podfile 中,例如

    platform :ios, '10.0'

    target 'MyApp' do
        use_frameworks!
        pod 'BlueSignals'
    end

开始之前

您需要做的第一件事是导入 Signals 框架。这可以通过以下方式完成

import Signals

提供的 API

Signals 提供了四 (4) 个类级别的 API。其中三 (3) 个用于捕获和处理操作系统信号。另一个函数允许引发信号。

监视信号

SignalWatch 提供了一个接口,允许被捕获的信号通知多个“信号监视器”。 通过这种方式,信号陷阱可以在同一应用程序中的库之间共享。 在大多数情况下,这可以直接替代 trap()

当通过 SignalWatch 添加信号时,它将通过 trap() 在该信号上安装自己的处理程序。 因此,在使用 SignalWatch 时,重要的是不要直接使用 trap()。 如果信号的所有观察者都被移除,SignalWatch 将智能地恢复在 SignalWatch 之前安装的处理程序。

import Signals

...
let server: SomeServer = ...


SignalWatch.shared.on(signal: .int) { _ in
 		server.shutdownServer()
}

server.run()

捕获信号

下面的示例展示了如何向服务器添加 trap 处理程序,以便在用户按下 ^C(向进程发送 SIGINT)时执行有序关闭。

import Signals

...

let server: SomeServer = ...

Signals.trap(signal: .int) { signal in

	server.shutdownServer()
}

server.run()

此外,还提供了基于上述基本 API 构建的便捷 API,这些 API 允许捕获多个信号,每个信号对应一个单独的处理程序或一个公共处理程序。

引发信号

此示例说明了如何使用 Signals 向操作系统引发信号,在本例中为 SIGABRT

import Signals

...

Signals.raise(signal: .abrt)

忽略信号

此示例说明了如何使用 Signals 忽略操作系统信号,在本例中为 SIGPIPE

import Signals

...

Signals.ignore(signal: .pipe)

恢复信号的默认处理程序

此示例说明了如何使用 Signals 恢复信号的默认处理程序,在本例中为 SIGPIPE

import Signals

...

Signals.restore(signal: .pipe)

添加用户定义的信号

此示例显示了如何添加用户定义的信号,为其添加 trap 处理程序,然后引发信号。

import Signals

let mySignal = Signals.Signal.user(20)

Signals.trap(signal: mySignal) { signal in

	print("Received signal \(signal)")
}

Signals.raise(signal: mySignal)

上面代码段的输出是

Received signal 20

社区

我们很乐意谈论服务器端 Swift 和 Kitura。加入我们的 Slack 来与团队见面!

许可证

此库根据 Apache 2.0 获得许可。完整的许可证文本可在 LICENSE 中找到。