Überlassen Sie die Entscheidung über den Umgang immer EINTR
dem Benutzer und machen Sie es einfach, den Vorgang entsprechend fortzusetzen.
Normalerweise ist der beste Weg, dies zu tun, die Rückkehr von Ihrer Bibliotheksfunktion zum Aufrufer EINTR
, aber in einigen Fällen ist ein Rückruf oder eine andere Implementierung möglicherweise besser - welcher Weg am besten ist, hängt von anderen Faktoren ab, aber lassen Sie den Benutzer immer wieder versuchen, und fortsetzen.
Dies bedeutet, dass Sie, wenn Ihr Bibliothekscode teilweise erfolgreich sein kann , bevor Sie einen erhalten EINTR
, sorgfältig überlegen sollten, was der Benutzer möglicherweise über diesen teilweisen Erfolg wissen muss oder ob der Benutzer den Vorgang möglicherweise dort fortsetzen muss, wo er fehlgeschlagen ist. Möglicherweise müssen Sie zusätzliche Informationen zurückgeben oder eine Schnittstelle für die Wiederaufnahme von jedem Ort bereitstellen, für den dies angemessen sein könnte.
Dies ist der Grund, warum Systemaufrufe wie read
und write
heutzutage teilweise Erfolg zurückgeben - weil es als Benutzer sehr frustrierend ist, gesagt zu werden:
Sie haben versucht zu schreiben "foo"
und wir haben erfolgreich entweder nichts oder "f"
oder geschrieben "fo"
, und Sie wissen nicht, welche . Habe Spaß! Ich hoffe, Ihr System kann den gesamten Schreibvorgang nach einem dieser Schritte neu starten!
Natürlich, in einigen Fällen, wir sollten Systeme Griff Situationen schreiben genau so - zum Beispiel, vielleicht nach einer partiellen Schreib Sie die Datei immer neu, oder die Netzwerkverbindung wieder öffnen, oder Sie verwenden , um einige Byte „Start über“ zu bedeuten - Es hängt also davon ab, auf welche Anwendungsfälle Ihre Bibliothek abzielt.
Wenn eine Bibliotheksfunktion mehrere Operationen ausführt und es keine Möglichkeit gibt zu wissen, bei welcher von ihnen sie fehlgeschlagen ist, und diese Operationen nicht alle sicher und effizient idempotent sind, macht dies eine Bibliothek im Grunde genommen für Code unbrauchbar, der robust sein muss.
Wenn alle Schritte in einer Bibliotheksfunktion sind sicher und effizient idempotent, oder ist das Ganze Atom - wie eine Sperre zu erwerben - dann nur den Benutzer wissen zu lassen , dass ein EINTR
zufällig ist genug.
Wenn wir es erneut versuchen EINTR
, können wir auch die Signalbehandlung unterbrechen . Auf der niedrigen Ebene können Signalhandler nur einen begrenzten Satz von Funktionen sicher verwenden. In vielen Fällen setzt ein Signalhandler lediglich einen Booleschen Wert, der angibt, dass das Signal empfangen wurde, und kehrt dann zurück, in der Erwartung, dass der Code fortgesetzt wird Verlassen Sie alles, was es tat. Wenn wir eine erhalten EINTR
und dann erneut versuchen, anstatt die Kontrolle an den Benutzer zurückzugeben, verhindern wir möglicherweise, dass der Code dies tut.
Was nach einer vollständigen Programmentscheidung zu tun EINTR
ist - die richtige Antwort kann nicht bekannt sein, ohne zu wissen, was das Programm tut und wie das Programm auf ein Signal reagieren soll, und es hat Auswirkungen auf den Rest des Programms.
Zu wissen, wie oder ob der Benutzer möglicherweise fortfahren muss, und dem Benutzer bei Bedarf zu helfen, liegt in der Verantwortung der Bibliothek. Die richtige Antwort kann nicht bekannt sein, ohne zu wissen, was die Bibliothek tut.
EINTR
und dies dem Anrufer zu melden), aber es kann davon abhängen, was Ihre Bibliothek tut ...