Вариант использования — это необходимость маскировать SIGPIPE
в потоках pthread, которые выполняют свои собственные write()
и/или SSL_write()
, и компилировать их в текущих POSIX-системах, таких как Linux, macOS, BSD и т. д. Типичный подход к Linux объясняется довольно хорошо здесь, и есть много хороших дополнительных обсуждений по теме здесь.
Типичный signal(SIGPIPE, SIG_IGN)
работает везде, где я пробовал, но (я считаю) должно быть более хирургическое решение, позволяющее избежать глобального игнорирования SIGPIPE
. Также было бы неплохо по возможности избегать прагмы, специфичной для платформы.
Похоже, что функция sigtimedwait()
не существует в (текущих?) версиях macOS, поэтому маловероятно, что кросс-платформенное решение использует этот подход.
Кажется, что функция sigwait()
существует везде, но она заблокируется навсегда, если конкретный сигнал на самом деле не ожидается. Таким образом, следующий лучший подход, по-видимому, состоит в том, чтобы использовать sigpending()
для просмотра того, что ожидается, а затем sigwait()
для его обслуживания, которые оба кажутся доступными.
Что меня беспокоит, так это то, что практически ничего (что я могу найти) не написано по этой конкретной проблеме, что обычно является признаком того, что я упускаю что-то болезненно очевидное.
Итак, является ли pthread_sigmask()
/ sigpending()
/ sigwait()
/ pthread_sigmask()
хорошим выбором для описанного выше варианта использования? Или есть (не?) очевидные подводные камни, о которых я должен знать?
SIGPIPE
Почему? Если вы правильно обрабатываете ошибки,SIGPIPE
в большинстве ситуаций бесполезна. См. Как предотвратить SIGPIPE (или правильно с ними обращаться) b> и Почему существует SIGPIPE? - person Andrew Henle   schedule 03.08.2020sigaction()
. Эта функция предназначена для каждого процесса, а не для потока. Я надеялся на более хирургический подход, который позволил бы мне абстрагировать поведение в библиотеку, которая имела бы как можно меньше глобальных эффектов. - person Chuck Wolber   schedule 03.08.2020