Приложение 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)
Другие вопросы по тегам