Prüfen, ob errno != EINTR: was bedeutet das?

Lesezeit: 4 Minuten

Benutzeravatar von Robb1
Robb1

Ich habe festgestellt, dass dieses Stück Code mehrmals verwendet wird (auch ein ähnlicher, wo es verwendet wird open() Anstatt von write()).

int c = write(fd, &v, sizeof(v));
if (c == -1 && errno != EINTR) {
    perror("Write to output file");
    exit(EXIT_FAILURE);
}

Warum wird geprüft, ob && errno != EINTR hier ?

Auf der Suche nach errno an Mann Dazu habe ich folgenden Text gefunden EINTRaber selbst wenn ich besuchte man 7 signal das klärt mich nicht auf.

EINTR Unterbrochener Funktionsaufruf (POSIX.1); siehe signal(7).

  • Ü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 NICHT int. 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

Benutzeravatar von Barmar
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.).

  • Könnte für Nerds nützlich sein, Unterbrechen

    – Orchan Alichanow

    10. November 2019 um 18:24 Uhr

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”.

    – null cool

    25. Mai 2019 um 15:18 Uhr


Von dem Manpage an write:

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

1409460cookie-checkPrüfen, ob errno != EINTR: was bedeutet das?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy