2011-05-10 4 views
2

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

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) { 
     //... 
    } 

До сих пор не работает.

ответ

1

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

Следующий код работает отлично на 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; 
} 
+0

Тогда у меня нет подсказки, где я ошибаюсь :( –

+0

@ user408141: Работает ли мой код для вас? Какой вывод вы получите, если вы его построите, запустите и убейте -USR2 это –

+0

@ user408141: Кроме того, не запускайте программу в отладчике. Я видел, что отладчик и сигналы не работают вместе в прошлом. Отладчик может быть проблемой. –

1

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

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

+0

Я пробовал, но без успеха. Я добавил новую строку: sigset_t sigset; sigemptyset (& sigset); sigaddset (& sigset, SIGILL); sigaddset (& sigset, SIGUSR2); sigprocmask (SIG_BLOCK, & sigset, 0); sigwait (& sigset, & received); Still worng. –

+0

+1 для 'check return value from 'sigwait()'. –

+0

Я проверил его, он возвращает 0. –

Смежные вопросы