Quand et comment les appels système sont-ils interrompus?
C'est une question de suivi à Est un succès send() "atomique"?car je pense qu'il s'agit, en réalité, les appels système en général, et pas seulement les envoie sur les sockets.
Qui appels système peut être interrompu, et lorsqu'ils le sont, d'où l'interruption est traitée? J'ai appris sur le SA_RESTART, mais ne pas comprendre exactement ce qui se passe.
- Si je fais un appel système sans SA_RESTART, peut l'appel interrompu par tout type d'interruptions (par exemple, la saisie de l'utilisateur) qui ne concernent pas ma requête, mais nécessitent l'OS pour abandonner mon appel et de faire quelque chose d'autre? Ou est-ce seulement interrompu par des signaux qui concernent directement mon processus (CTRL+C, socket fermée, ...)?
- Lors de la configuration de SA_RESTART, ce sont la sémantique d'un send() ou tout autre "lent" syscall? Il sera toujours bloquer jusqu'à ce que toutes mes données sont transmises ou le socket va vers le bas, ou peut-il revenir avec un nombre plus petit que le comte de send()'s paramètre?
- Où est le redémarrage de mise en œuvre? L'OS sais que je veux l'appel à être redémarré sur les interruptions, ou est un signal envoyé à mon processus et ensuite traités par le code de la bibliothèque? Ou dois-je le faire moi-même, par exemple, envelopper l'appel dans une boucle while et recommencez aussi souvent que nécessaire?
source d'informationauteur lxgr
Vous devez vous connecter pour publier un commentaire.
Appels système peut être interrompue par tout signalil peut s'agir de signaux SIGINT (généré par CTRL-C), SIGHUP, etc.
Quand
SA_RESTART
est réglé, unsend()
de retour (avec l'envoyé comte) si toutes les données ont été transmises avant le signal a été reçu, il renvoie une erreurEINTR
si un envoi délai d'attente a été défini (que ceux qui ne peuvent pas être redémarré), sinon lesend()
sera redémarré.Appel système redémarrage est mis en œuvre dans le noyau de traitement de signal de code. Le système d'appel en interne renvoie
-ERESTARTSYS
lors de la détection en attente d'un signal (ou avoir une attente interrompue par un signal), ce qui provoque le signal de code de traitement pour restaurer le pointeur d'instruction et registres pertinents à l'état d'avant l'appel, faisant le syscall répéter.