Когда моя сложная многопоточная программа вызывает poll (2), вызов прерывается - даже если все сигналы были заблокированы.Кроме того, установленный обработчик сигналов для всех сигналов никогда не вызывается.Я хотел бы получить некоторые идеи о том, что может быть причиной этого.
Программа слишком сложна для включения, но вот фрагмент кода, который иллюстрирует проблему:
#define _XOPEN_SOURCE 700
#undef NDEBUG
#include <assert.h>
#include <poll.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
void foo(const int sock)
{
sigset_t allSigs;
sigfillset(&allSigs);
int status = pthread_sigmask(SIG_BLOCK, &allSigs, NULL); // Blocks all signals
assert(status == 0);
{
sigset_t sigset;
status = sigpending(&sigset);
assert(status == 0);
for (int sigNum = 1; sigNum < _NSIG; ++sigNum)
if (sigismember(&sigset, sigNum))
fprintf(stderr, "Signal %d is pending", sigNum); // Prints nothing
}
struct pollfd pfd;
pfd.fd = sock;
pfd.events = POLLRDNORM;
errno = 0; // Just to make sure
status = poll(&pfd, 1, 30000); // All-signals signal-handler never called
if (status < 0)
perror("poll() failure"); // Prints "poll() failure: Interrupted system call"
}
Я знаю, этоневозможно - все же это происходит.
Если у вас есть какие-либо идеи о том, что может быть причиной этого, я бы хотел их услышать.
Вот мое окружение:
$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
$ uname -a
Linux gilda 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ gcc -dumpversion
4.8.5