Связь медленного системного вызова с сигналом

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

Но когда я его выполнил, тайм-аут ничего не делает.
Я не могу понять, почему.
Не могли бы вы объяснить и показать мне еще один пример медленного системного вызова?

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

static void sig_alrm(int signo){

}

int main(){
    int n;
    char line[50];

    if(signal(SIGALRM, sig_alrm) == SIG_ERR)
        printf("signal(SIGALRM) error");

    alarm(1);
    if((n = read(STDIN_FILENO, line, 50)) < 0)
        printf("read error");
    alarm(0);

    write(STDOUT_FILENO, line, n);
    exit(0);
}    

person manut    schedule 03.06.2011    source источник


Ответы (1)


Ваш обработчик вызывается через секунду. Если вы проверите, вы увидите, что он вызывается. Я не рекомендую ставить printf, так как он не безопасен для асинхронного сигнала, вы можете заставить его установить переменную или что-то в этом роде.

Впрочем, вернемся к вопросу. Если вам интересно, почему read не выходит из строя с EINTR, ответ будет SA_RESTART. В большинстве систем Unix несколько системных вызовов автоматически перезапускаются в случае сигнала.

Список нестандартный, но IIRC read(v), write(v) и друзья входят в число тех, кого обычно перезапускают.

person cnicutar    schedule 03.06.2011