Vérifier si errno != EINTR: ça veut dire quoi?
J'ai trouvé ce bout de code utilisé plusieurs fois (également similaire à celui 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 il est vérifié si && errno != EINTR
ici ?
À la recherche pour errno
sur homme j'ai trouvé le texte suivant sur EINTR
, mais même si j'ai visité man 7 signal
qui ne m'éclairer.
EINTR interrompt l'appel de fonction (POSIX.1); voir signal(7).
Voir la page de man pour
Notez également que
Merci à vous deux! @AndrewHenle je le sais, j'ai juste décidé de copier le bout de code que j'ai trouvé 🙂 pensez-vous que je devrais modifier la question tout de même avec
write
à la place. Il devrait vous dire ce que errno sur certaines erreurs.Notez également que
write()
retourne ssize_t
, et PAS int
. Ils ne sont pas les mêmes.Merci à vous deux! @AndrewHenle je le sais, j'ai juste décidé de copier le bout de code que j'ai trouvé 🙂 pensez-vous que je devrais modifier la question tout de même avec
ssize_t
au lieu de int
?
OriginalL'auteur Robb1 | 2017-01-04
Vous devez vous connecter pour publier un commentaire.
De nombreux appels système sera rapport de la
EINTR
code d'erreur si un signal est produite lors de l'appel système est en cours. Aucune erreur ne s'est effectivement produite, c'est juste signalé cette façon, parce que le système n'est pas en mesure de reprendre l'appel système automatiquement. Ce modèle de codage simplement tentatives de l'appel système lorsque cela se produit, d'ignorer l'interrompre.Par exemple, cela peut se produire si le programme utilise
alarm()
d'exécuter du code en mode asynchrone lorsqu'un temps imparti. Si le délai d'attente se produit lorsque le programme est en appelantwrite()
, on a juste envie de le redémarrer.OriginalL'auteur Barmar
De la page de man sur
write
:EINTR
peut (ou, plus important, ne peut pas) arriver. Je considère que le plus important parce que l'incapacité de comprendre qu'il ne peut généralement pas se produire est une cause de fin de fret-culting.la réponse n'est pas vraiment suffisant; il n'a pas d'expliquer les situations dans lesquelles l'
EINTR
peut (ou, plus important, ne peut pas) arriver. Je considère que le plus important parce que l'incapacité de comprendre qu'il ne peut généralement pas se produire est une cause de fin de fret-culting. Si vous n'avez pas "culte du cargo" appels système, de changer quelque chose, comme le masque de signal d'un processus peut casser des choses n'importe où. Si vous aimez écrire fragile code qui peut être rompu par quelque chose de complètement différent, c'est votre choix. Mais merci de ne pas caractériser l'écriture de code robuste comme "cargo-culting".L'installation d'une interruption de gestionnaire de signal est un envahissantes et intentionnelle chose à faire lorsque vous voulez pour l'erreur de blocage des appels que interrompus. Boucle pour répéter lorsque cela se produit, ne fait pas de sentiment en général, uniquement lorsque vous savez que vous voulez vraiment un comportement.
pouvez-vous expliquer (ou peut-être juste un lien vers une explication de l') une situation qui peut mener à un gestionnaire de signal étant une option raisonnable?
OriginalL'auteur Kevin
les réponses ici sont vraiment bons et je tiens à ajouter quelques détails internes :
et le responsable de cette tâche est la
restart_block
qui est utilisé pour suivre les informations et les arguments pour le redémarrage de système d'appelsOriginalL'auteur zerocool