Опрос Linux (2) прерван, хотя все сигналы заблокированы - PullRequest
0 голосов
/ 01 декабря 2018

Когда моя сложная многопоточная программа вызывает 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
...