Попробуйте это:
sigset_t set, oldset;
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, &oldset);
/* use send all you like here */
sigtimedwait(&set, 0, (struct timespec [1]){0});
pthread_sigmask(SIG_SETMASK, &oldset, 0);
Я не уверен на 100%, что это работает, но я верю, что это должно, и если это правильно, то это решение, которое можно использовать из кода библиотеки, не испортивсостояние вызывающего или других потенциально использующих сигнал потоков.
Также обратите внимание, что если программа (или даже просто текущий поток) не хочет использовать SIGPIPE
, вы можете значительно упростить этопросто оставив SIGPIPE
навсегда заблокированным:
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, &oldset);