Связь медленного системного вызова с сигналом - PullRequest
2 голосов
/ 03 июня 2011

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

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

#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);
}    

1 Ответ

1 голос
/ 03 июня 2011

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

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

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