sigwait () не работает в многопоточной программе - PullRequest
1 голос
/ 09 февраля 2020

Я пытаюсь написать многопоточную программу, один поток (переменный поток которой ниже) отвечает за любые асинхронные сигналы, которые могут быть установлены для этого процесса.

Я сталкиваюсь с потоком, использующим sigwait () но не реагирует ни на какие сигналы, отправленные на обработку. (как SIGUSR1 ниже).

static void * signal_thread(void *arg = nullptr)
{
    int sig = -1;
    sigset_t sigset;
    sigfillset(&sigset);
    pthread_sigmask(SIG_BLOCK, &sigset, NULL);
    while(1)
    {
       int s = sigwait(&sigset, &sig);
       if(s == 0)
          printf("SIG %d recieved!...\n", sig);
       usleep(20);
    }
}

int main()
{
    sigset_t signalset;
    pthread_t thread;
    pthread_create(&thread, NULL, &signal_thread, nullptr);
    sigfillset(&signalset);
    pthread_sigmask(SIG_BLOCK, &signalset, NULL);

    while(1)
    {
       raise(SIGUSR1);
       usleep(20);
    }
}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

raise(sig) является эквивалентом вызова pthread_kill(pthread_self(), sig).

Так как main поток raise() s сигнал, SIGUSR1 будет сгенерирован для этого потока, а не для любого другого. Таким образом, ваш signal_thread не сможет sigwait() для USR1, который будет удерживаться в ожидании потока, который его сгенерировал.

0 голосов
/ 09 февраля 2020

Проблема связана с двумя проблемами:

Во-первых, вызов повышения в основном отправленном сигнале только для основного потока, а не для всего процесса.

Во-вторых, вместо этого следует использовать std :: cout printf в signal_thread.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...