Viele Systemaufrufe melden den EINTR
Fehlercode, wenn während des Systemaufrufs ein Signal aufgetreten ist. Tatsächlich ist kein Fehler aufgetreten, er wird nur so gemeldet, weil das System den Systemaufruf nicht automatisch fortsetzen kann. Dieses Codierungsmuster wiederholt einfach den Systemaufruf, wenn dies passiert, um den Interrupt zu ignorieren.
Dies kann beispielsweise passieren, wenn das Programm alarm()
verwendet Code asynchron auszuführen, wenn ein Timer abgelaufen ist. Wenn die Zeitüberschreitung auftritt, während das Programm write()
aufruft , wir wollen nur den Systemaufruf wiederholen (auch bekannt als Lesen/Schreiben usw.).
Die Antworten hier sind wirklich gut und ich möchte einige interne Details hinzufügen:
Durch Signale unterbrochene Systemaufrufe können entweder abbrechen und EINTR
zurückgeben oder sich automatisch neu starten, wenn und nur wenn SA_RESTART
wird in sigaction(2)
angegeben
und derjenige, der für diese Aufgabe verantwortlich ist, ist restart_block
das verwendet wurde, um Informationen und Argumente für den Neustart von Systemaufrufen zu verfolgen
Von der Manpage auf write
:
Der Anruf wurde durch ein Signal unterbrochen, bevor Daten geschrieben wurden