iOS SWIFT应用程序 - 如何全局忽略SIGPIPE信号?

时间:2014-12-11 15:47:58

标签: swift ios8 signals sigpipe

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

1 个答案:

答案 0 :(得分:4)

语法与C程序中的语法相同:

signal(SIGPIPE, SIG_IGN)

问题是Swift中没有定义SIG_IGN。对于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)