Wie kann ich einen Dateizeiger ( FILE* fp ) in einen Dateideskriptor (int fd) umwandeln?

Lesezeit: 3 Minuten

Benutzeravatar von Phil Miller
Phil Müller

Ich habe ein FILE *zurückgegeben durch einen Aufruf an fopen(). Ich muss daraus einen Dateideskriptor bekommen, um Anrufe wie z fsync(fd) darauf. Was ist die Funktion, um einen Dateideskriptor von einem Dateizeiger zu erhalten?

  • Oder Sie könnten die Datei mit open(2) öffnen, und Sie hätten von Anfang an einen Dateideskriptor

    – Antoine Pelisse

    29. Juni 2013 um 16:13 Uhr


  • Und umgekehrt: Wie bekomme ich einen FILE-Zeiger von einem Dateideskriptor?

    – Michael Burr

    1. Oktober 2013 um 20:35 Uhr

Benutzeravatar von Phil Miller
Phil Müller

Die eigentliche Funktion ist int fileno(FILE *stream). Es ist darin zu finden <stdio.h>und ist ein POSIX-Standard, aber kein Standard-C.

  • Genau genommen müssten keine Header oder Bibliotheken erwähnt werden, wenn die Funktion tatsächlich Teil der Standard-C-Bibliothek wäre. Allerdings ist es kein Standard, weshalb es sinnvoll sein könnte, zumindest den Header zu erwähnen.

    – AnT steht zu Russland

    2. Juli 2010 um 23:55 Uhr

  • Der Zugriff auf Funktionen in der Standard-C-Bibliothek erfordert das Einfügen von Headern, zumindest wenn Ihr Compiler Prototypen erwartet (ich erinnere mich nie, was in dieser Hinsicht tatsächlich Standardverhalten ist). Ohne Header werden am Anfang einer C-Datei keine Namen definiert.

    – Phil Müller

    3. Juli 2010 um 0:20 Uhr

  • @Novelocrat: Ich meinte nicht, dass es nicht nötig ist #include irgendetwas. Ich meinte nur, dass es immer einfach ist, den Namen des richtigen Headers für a zu finden Standard Funktion. Das heißt, es ist nicht wirklich wichtig, den genauen Header-Namen in der Antwort zu erwähnen.

    – AnT steht zu Russland

    3. Juli 2010 um 1:51 Uhr

  • Dies ist eine gute Antwort, aber es ist erwähnenswert, dass dies keine Standard-c-Funktion ist, sondern eine Posix-Funktion.

    – Evan Teran

    3. Juli 2010 um 4:00 Uhr

  • Es ist nicht im C-Standard enthalten, da Dateideskriptoren eine UNIX-Sache sind (unter Linux ist es open(2), nicht open(3)).

    – kein Benutzer

    16. Oktober 2014 um 9:08 Uhr

Benutzeravatar von Mark Gerolimatos
Markus Gerolimatos

Selbst wenn fileno(FILE *) einen Dateideskriptor zurückgeben kann, seien Sie SEHR vorsichtig, den Puffer von stdio nicht zu umgehen. Wenn Pufferdaten vorhanden sind (entweder Lese- oder nicht geleerte Schreibvorgänge), können Lese-/Schreibvorgänge aus dem Dateideskriptor zu unerwarteten Ergebnissen führen.

Um eine der Nebenfragen zu beantworten und einen Dateideskriptor in einen Dateizeiger umzuwandeln, verwenden Sie fdopen(3)

  • Ich glaube nicht, dass dies für Leute hilfreich war, die speziell danach suchten, und dies wurde bereits einen Monat vor dem Schreiben im Kommentarbereich des Beitrags von OP beantwortet. Dies ist eher eine logische Klarstellung als eine echte Information.

    – kevr

    1. Februar 2018 um 15:03 Uhr

  • Kommentare, die soooo wichtig sind, müssen als Antworten erhoben werden. Ein riesiger Prozentsatz der Kommentare sind bissige, sinnlose Metakommentare wie deiner … und dieser 😉

    – Mark Gerolimatos

    15. Januar 2019 um 21:47 Uhr


  • @MarkGerolimatos Diese Antwort ist wirklich hilfreich, wäre aber noch mehr, wenn Sie weitere Informationen bereitstellen würden. Insbesondere, wenn ich den Dateideskriptor lesen/schreiben möchte, wie vermeide ich es, den Puffer von stdio zu umgehen? Vielen Dank!

    – Max888

    20. November 2021 um 15:32 Uhr

Benutzeravatar von Jim Hawkins
Jim Hawkins

  fd = _fileno(fp);  // Probably the best way
       fd = fp->_file;     // direct from the FILE structure, member 

   
    typedef struct _iobuf  {
       char*   _ptr;
       int     _cnt;
       char*   _base;
       int     _flag;
       int     _file;
       int     _charbuf;
       int     _bufsiz;
       char*   _tmpfname; } FILE;

1425810cookie-checkWie kann ich einen Dateizeiger ( FILE* fp ) in einen Dateideskriptor (int fd) umwandeln?

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

Privacy policy