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