5

我试图忽略我在 Swift 应用程序中使用的第三方 SDK 抛出的 SIGPIPE 信号。如何让我的应用程序全局忽略 SIGPIPE 信号?

4

1 回答 1

5

语法与 C 程序中的相同:

signal(SIGPIPE, SIG_IGN)

问题是SIG_IGNSwift 中没有定义。对于 C 程序,它定义<sys/signal.h>

#define SIG_IGN     (void (*)(int))1

但是这个整数到指针的转换并没有导入到 Swift 中,所以你必须自己定义它:

let SIG_IGN = CFunctionPointer<((Int32) -> Void)>(COpaquePointer(bitPattern: 1))
signal(SIGPIPE, SIG_IGN)

对于Swift 2 (Xcode 7),以下应该可以工作:

typealias SigHandler = @convention(c) (Int32) -> Void
let SIG_IGN = unsafeBitCast(COpaquePointer(bitPattern: 1), SigHandler.self)
signal(SIGPIPE, SIG_IGN)

Swift 2.1 (Xcode 7.1) 开始, SIG_IGN它被定义为公共属性,您可以简单地编写

signal(SIGPIPE, SIG_IGN)
于 2014-12-11T16:26:55.997 回答