Застрял с сигвейтом - PullRequest
2 голосов
/ 11 мая 2011

Я сделал что-то не так в своем коде, когда другой процесс отправил ему сигнал SIGUSR2:

sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGILL);
sigaddset(&sigset, SIGUSR2);
sigwait(&sigset, &received);

XCode замечает сигнал SIGUSER2 (31), полученный, но полученный = SIGILL (4) (или минимальный сигнал в наборе).

Почему это так? Где я не прав?

Теперь это выглядит так:

    sigset_t sigset;
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGILL);
    sigaddset(&sigset, SIGUSR2);
    sigprocmask(SIG_BLOCK, &sigset, 0);
    sigwait(&sigset, &received);
    if(received == SIGUSR2) {
        //...
    } else if(received == SIGILL) {
        //...
    }

Все еще не работает.

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Иногда мешает отладчик. Я видел, как отладчики вмешивались в обработку сигналов раньше. Попробуйте запустить код без участия отладчика.

Следующий код отлично работает на OS X:

#include <signal.h>
#include <stdio.h>

int main()
{
    sigset_t set;
    int sig;

    sigemptyset(&set);
    sigaddset(&set, SIGUSR1);
    sigaddset(&set, SIGUSR2);
    sigprocmask(SIG_BLOCK, &set, NULL);
    sigwait(&set, &sig);
    printf("Got signal %d\n", sig);
    return 0;
}
1 голос
/ 11 мая 2011

Как указано в соответствующем вопросе sigwait в Linux (Fedora 13) против OS X , вам необходимо заблокировать сигнал, используя sigprocmask() (для однопоточных приложений) или pthread_sigmask() (для нескольких приложения).

Проверка возвращаемого значения sigwait на ошибки также не будет плохой.

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