web-dev-qa-db-fra.com

Vérifier si errno! = EINTR: qu'est-ce que cela signifie?

J'ai trouvé ce morceau de code utilisé plusieurs fois (également un morceau similaire où il est utilisé open() au lieu de write()).

int c = write(fd, &v, sizeof(v));
if (c == -1 && errno != EINTR) {
    perror("Write to output file");
    exit(EXIT_FAILURE);
}

Pourquoi est-il vérifié si && errno != EINTR ici?

Vous recherchez errno sur homme J'ai trouvé le texte suivant à propos de EINTR, mais même si j'ai visité man 7 signal cela ne m'éclaire pas.

EINTR Appel de fonction interrompu (POSIX.1); voir signal (7).

17
Robb1

De nombreux appels système signalent le code d'erreur EINTR si un signal s'est produit pendant l'appel système. Aucune erreur ne s'est réellement produite, elle est simplement signalée de cette façon car le système n'est pas en mesure de reprendre automatiquement l'appel système. Ce modèle de codage réessaye simplement l'appel système lorsque cela se produit, pour ignorer l'interruption.

Par exemple, cela peut se produire si le programme utilise alarm() pour exécuter du code de manière asynchrone lorsqu'un temporisateur s'épuise. Si le délai d'expiration se produit pendant que le programme appelle write(), nous voulons simplement réessayer l'appel système (alias lecture/écriture, etc.).

28
Barmar

les réponses ici sont vraiment bonnes et je veux ajouter quelques détails internes:

Les appels système interrompus par des signaux peuvent soit abandonner et renvoyer EINTR, soit redémarrer automatiquement si et seulement si SA_RESTART Est spécifié dans sigaction(2)

et le responsable de cette tâche est le restart_block qui permet de suivre les informations et les arguments pour redémarrer les appels système

3
zerocool

Depuis la page de manuel sur write:

L'appel a été interrompu par un signal avant l'écriture des données

2
Kevin