Überprüfen Sie die Manpage für write stattdessen. Es sollte Ihnen sagen, auf welche Fehlernummer bei bestimmten Fehlern gesetzt ist.
– Kevin
4. Januar 2017 um 22:33 Uhr
Beachten Sie auch das write() kehrt zurück ssize_tund NICHTint. Sie sind nicht gleich.
– Andreas Henle
5. Januar 2017 um 0:04 Uhr
Danke euch beiden! @AndrewHenle Ich weiß es, ich habe mich gerade entschieden, das Stück Code zu kopieren, wie ich es gefunden habe 🙂 Meinst du, ich sollte die Frage trotzdem bearbeiten? ssize_t Anstatt von int?
– Robb1
5. Januar 2017 um 9:23 Uhr
Barmar
Viele Systemaufrufe werden dies melden 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 geschieht, um den Interrupt zu ignorieren.
Dies kann beispielsweise passieren, wenn das Programm verwendet wird alarm() Code asynchron auszuführen, wenn ein Timer abgelaufen ist. Wenn die Zeitüberschreitung auftritt, während das Programm aufruft write()möchten wir 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:
Systemaufrufe, die durch Signale unterbrochen werden, können entweder abbrechen und zurückkehren EINTR oder automatisch neu starten, wenn und nur wenn SA_RESTART ist angegeben in sigaction(2)
und derjenige, der für diese Aufgabe verantwortlich ist, ist der restart_block die verwendet wurde, um Informationen und Argumente für den Neustart von Systemaufrufen zu verfolgen
Kannst du mir sagen woher der Bezug kommt? Ich möchte einen Blick darauf werfen. 🙂
– Rick
29. März 2019 um 10:44 Uhr
@Rick Ich vergesse, es tut mir sehr leid, aber ich denke, ich habe mit x86 und Kernel-Sachen zu tun, weil ich zu dieser Zeit viele Bücher darüber gelesen habe, wie Sachen funktionieren, also vielleicht das Buch “Linux Kernel verstehen” oder das Buch “Linux Programming Interface”.
Der Anruf wurde durch ein Signal unterbrochen, bevor Daten geschrieben wurden
Diese Antwort ist nicht wirklich ausreichend; es erklärt nicht die Situationen, unter denen EINTR kann (oder noch wichtiger, kann nicht) passieren. Letzteres halte ich für wichtiger, weil das Nichtverständnis, dass es normalerweise nicht passieren kann, eine Ursache für endlosen Cargo-Culting ist.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
4. Januar 2017 um 22:52 Uhr
@R.. Diese Antwort ist nicht wirklich ausreichend; es erklärt nicht die Situationen, unter denen EINTR kann (oder noch wichtiger, kann nicht) passieren. Letzteres halte ich für wichtiger, weil das Nichtverständnis, dass es normalerweise nicht passieren kann, eine Ursache für endlosen Cargo-Culting ist. Wenn Sie keine Systemaufrufe “cargo cult” betreiben, kann das Ändern von etwas wie der Signalmaske eines Prozesses überall etwas kaputt machen. Wenn Sie gerne fragilen Code schreiben, der durch etwas völlig Unabhängiges gebrochen werden kann, ist das Ihre Wahl. Aber bitte bezeichnen Sie das Schreiben von robustem Code nicht als “Cargo-Culting”.
– Andreas Henle
5. Januar 2017 um 0:02 Uhr
@AndrewHenle: Das Installieren eines unterbrechenden Signalhandlers ist eine invasive und absichtliche Sache, die Sie tun, wenn Sie wollen Fehler-out beim Blockieren von Systemaufrufen, die unterbrochen werden. Eine Schleife zu wiederholen, wenn das passiert, macht im Allgemeinen keinen Sinn, nur wenn Sie wissen, dass Sie dieses Verhalten wirklich wollen.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
5. Januar 2017 um 2:46 Uhr
@R .. können Sie eine Situation erklären (oder vielleicht nur auf eine Erklärung verlinken), die dazu führen könnte, dass ein solcher Signalhandler eine sinnvolle Option ist?
– bmcorser
9. Oktober 2018 um 1:30 Uhr
@R..GitHubSTOPHELPINGICE und dieses Argument wirkt gegen Sie, denn das Letzte, was ich beim Schreiben einer Bibliothek tun werde, ist, so etwas wie einen Signalhandler zu implementieren. Die Realität ist, dass ich nicht weiß, ob der Benutzer einen Signal-Handler installieren wird oder nicht. Soll ich ihn in diesem Fall einfach diesen Code selbst schreiben lassen?
– Benutzer11877195
6. März um 12:45 Uhr
14094600cookie-checkPrüfen, ob errno != EINTR: was bedeutet das?yes
Überprüfen Sie die Manpage für
write
stattdessen. Es sollte Ihnen sagen, auf welche Fehlernummer bei bestimmten Fehlern gesetzt ist.– Kevin
4. Januar 2017 um 22:33 Uhr
Beachten Sie auch das
write()
kehrt zurückssize_t
und NICHTint
. Sie sind nicht gleich.– Andreas Henle
5. Januar 2017 um 0:04 Uhr
Danke euch beiden! @AndrewHenle Ich weiß es, ich habe mich gerade entschieden, das Stück Code zu kopieren, wie ich es gefunden habe 🙂 Meinst du, ich sollte die Frage trotzdem bearbeiten?
ssize_t
Anstatt vonint
?– Robb1
5. Januar 2017 um 9:23 Uhr