2011-06-03 4 views
2

J'apprends des appels et des signaux système lents.
Pour le système normal, l'appel système lent (lu depuis le terminal) peut bloquer indéfiniment.
et ci-dessous l'exemple, il est possible de lire pour expirer après un certain laps de temps.Relation entre un appel système lent et un signal

Mais quand je l'ai excuté, le temps mort ne fait rien.
Je ne comprends pas pourquoi.
Pourriez-vous m'expliquer et me montrer un autre exemple d'appel système lent?

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

Répondre

1

Votre gestionnaire est appelé après une seconde. Si vous vérifiez, vous verrez qu'il est appelé. Je ne recommande pas de mettre un printf car ce n'est pas un signal de sécurité asynchrone, vous pouvez le faire définir une variable ou quelque chose.

Quoi qu'il en soit, revenez à la question. Si vous vous demandez pourquoi le read n'échoue pas avec EINTR la réponse est SA_RESTART. Sur la plupart des systèmes Unix, quelques appels système sont automatiquement redémarrés en cas de signal.

La liste n'est pas standard mais IIRC read(v), write(v) et les amis font partie de ceux qui sont redémarrés fréquemment.

Questions connexes