API ненадежного сигнала - код не работает должным образом - PullRequest
0 голосов
/ 19 февраля 2010

Как правило, ожидаемый результат: он 5 раз перехватывает KeyboardInterrupt и выходит 6 раз (если 1-я строка handler () не закомментирована )

Теперь, если я тоже прокомментирую эту строку, тогда также поведение программы не изменить, хотя я использую ненадежный API.

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

Программа все еще закрывается после 5 ^ C .. ПОЧЕМУ? **

код работает даже без восстановление обработчика (). ЗАЧЕМ?

**

/* ursig1.c */
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static int count = 0;
void handler(int signo) {
//  signal(SIGINT,handler);
    /* Re-instate handler */
    ++count;
    /* Increment count */
    write(1,"Got SIGINT\n",11); /* Write message */
}
int
main(int argc,char **argv) {
    signal(SIGINT,handler);
    /* Register function */
    while ( count < 5 ) {
        puts("Waiting for SIGINT..");
        sleep(4);
        /* Snooze */
    }
    puts("End.");
    return 0;
}

1 Ответ

4 голосов
/ 19 февраля 2010

Прочтите справочную страницу Linux для signal (2) , в разделе Переносимость , где обсуждается различное поведение сигнала (2) в разных версиях.Unix.В частности,

В исходных системах Unix, когда обработчик, который был установлен с использованием signal (), был вызван доставкой сигнала, расположение сигнала будет сброшено до SIG_DFL, иСистема не блокировала доставку дальнейших экземпляров сигнала.Система V также предоставляет эту семантику для signal ().

Это ожидаемое вами поведение, но это не то, что обеспечивает Linux, как разрешено POSIX.1.Вы должны использовать sigaction (2) , чтобы установить обработчики сигналов для получения переносимого и определенного поведения.

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