De nombreux appels système rapporteront le EINTR
code d'erreur si un signal s'est produit alors que l'appel système était en cours. 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 l'appel système automatiquement. Ce modèle de codage réessaye simplement l'appel système lorsque cela se produit, pour ignorer l'interruption.
Par exemple, cela peut arriver si le programme utilise alarm()
pour exécuter du code de manière asynchrone lorsqu'un minuteur s'est écoulé. Si le délai d'attente se produit pendant que le programme appelle write()
, nous voulons juste réessayer l'appel système (c'est-à-dire lire/écrire, etc.).
les réponses ici sont vraiment bonnes et je veux ajouter quelques détails internes :
Les appels système qui sont interrompus par des signaux peuvent soit abandonner et renvoyer
EINTR
ou redémarrer automatiquement si et seulement siSA_RESTART
est spécifié danssigaction(2)
et le responsable de cette tâche est le restart_block
qui servait à suivre les informations et les arguments pour redémarrer les appels système
À partir de la page de manuel sur write
:
L'appel a été interrompu par un signal avant qu'aucune donnée ne soit écrite