Ungültiger Dateideskriptor

Lesezeit: 2 Minuten

Benutzer-Avatar
Lucy

Ich lerne etwas über Dateideskriptoren und habe diesen Code geschrieben:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int fdrd, fdwr, fdwt;
char c;

main (int argc, char *argv[]) {

    if((fdwt = open("output", O_CREAT, 0777)) == -1) {
        perror("Error opening the file:");
        exit(1);
    }

    char c="x";

    if(write(fdwt, &c, 1) == -1) {
        perror("Error writing the file:");
    }

    close(fdwt);
    exit(0);

}

aber ich bekomme: Error writing the file:: Bad file descriptor

Ich weiß nicht, was falsch sein könnte, da dies ein sehr einfaches Beispiel ist.

  • Was ist der Wert von fdwt bei der Rückkehr von open()? Es sollte eine kleine Ganzzahl sein, z. B. kleiner als 5. Da in diesem Code keine anderen fds offen sind, sollte es tatsächlich 3 sein (dh STDERR + 1).

    – Peter Wilson

    5. Juni 2011 um 20:11 Uhr


  • Übrigens hat Ihr Code mehrere problematische Bits. Diese Variablen müssen nicht global sein (nur wenige tun dies), Sie sollten sie in deklarieren main. Sie erklären auch c zweimal braucht man das nicht char in char c das zweite Mal. Gleichzeitig wird die zweite Erklärung von c in der Mitte der Funktion ist nur in C99 gültig, aber Sie deklarieren main ohne Rückgabetyp — was in C99 ungültig ist, wodurch die “implicit int”-Regel beseitigt wird, die in C89 und früheren Versionen von C vorhanden war. Die meisten Compiler sollten dafür Warnungen ausgeben, einige werden einen Fehler ausgeben und sich weigern zu kompilieren.

    – Nikolaus Ritter

    5. Juni 2011 um 20:27 Uhr


  • Sie sollten eine Antwort akzeptieren!

    – Gsamaras

    18. Februar 2015 um 17:24 Uhr

Versuche dies:

open("output", O_CREAT|O_WRONLY, 0777)

  • Wow! So schnell! 🙂 Das hat funktioniert! Jetzt muss ich herausfinden, warum! Vielen Dank!

    – Lucia

    5. Juni 2011 um 20:04 Uhr


  • @Lucy – Sie haben einen Dateideskriptor erhalten, sodass das Öffnen nicht fehlgeschlagen ist … aber der Deskriptor war zum Schreiben nicht gültig.

    – asveikau

    5. Juni 2011 um 20:06 Uhr

  • Können Sie erklären, warum O_WRONLY erforderlich ist und woher 0777 kommt?

    – PyWalker2797

    12. April 2020 um 0:54 Uhr

Ich finde O_CREAT allein reicht nicht. Versuchen Sie, hinzuzufügen O_WRONLY als Flag für den Open-Befehl.

Laut der open(2) Manpage:

Die Argumentflags müssen einen der folgenden Zugriffsmodi enthalten: O_RDONLY, O_WRONLY oder O_RDWR.

Also ja, wie von anderen vorgeschlagen, ändern Sie bitte Ihre open zu open("output", O_CREAT|O_WRONLY, 0777));. Verwenden O_RDWR wenn Sie aus der Datei lesen müssen. Sie können auch wollen O_TRUNC — Einzelheiten finden Sie in der Manpage.

1282260cookie-checkUngültiger Dateideskriptor

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

Privacy policy