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?
Wie kann ich einen Dateizeiger ( FILE* fp ) in einen Dateideskriptor (int fd) umwandeln?
Phil Müller
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
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
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;
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