Приложение iOS SWIFT - Как игнорировать сигнал SIGPIPE глобально?
Я пытаюсь игнорировать сигнал SIGPIPE, который генерируется сторонним SDK, который я использую в своем приложении Swift. Как сделать так, чтобы мое приложение игнорировало сигнал SIGPIPE глобально?
1 ответ
Решение
Синтаксис такой же, как в программе на C:
signal(SIGPIPE, SIG_IGN)
Проблема в том, что SIG_IGN
не определяется в Swift. Для программ на С это определяется в <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)