我试图忽略我在Swift应用程序中使用的第三方SDK抛出的SIGPIPE信号。 如何让我的应用程序全局忽略SIGPIPE信号?
答案 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)