Wie erhalte ich einen FILE-Zeiger aus einem Dateideskriptor?

84

Ich spiele mit mkstemp(), was einen Dateideskriptor bereitstellt, aber ich möchte eine formatierte Ausgabe über generieren fprintf(). Gibt es eine einfache Möglichkeit, den von bereitgestellten Dateideskriptor mkstemp()in eine FILE *Struktur umzuwandeln, die für die Verwendung mit geeignet ist fprintf()?

BD in Rivenhill
quelle

Antworten:

100

Verwendung fdopen():

FILE* fp = fdopen(fd, "w");
Richard Pennington
quelle
33
Und um den Dateideskriptor von einer DATEI * zu erhalten, verwenden Sie fileno(): linux.die.net/man/3/fileno
Lee Netherton
2
Wenn fdwurde mit einigen Flags (wie O_NONBLOCK) geöffnet - was passiert mit ihnen, nachdem fdopenes mit neuen Flags geöffnet wurde? Werden sie xorzusammen oder ersetzt?
Xealits
5
@jww: Dateideskriptoren sind zunächst nicht ANSI C.
Rufflewind
2
Ist es in irgendeiner Weise schlecht, fdopenmehrmals anzurufen ? (vorausgesetzt, es passiert in einer Funktion, die immer wieder aufgerufen wird)
phil294
2
@xealits Die Optionen für die DATEI * müssen im Bereich des bereits geöffneten Dateideskriptors liegen. Wenn Sie also fd mit schreibgeschützt und die DATEI * nur mit schreibgeschützt geöffnet haben, sollte eine Ausnahme ausgelöst werden. Weitere Informationen finden Sie unter ibm.com/support/knowledgecenter/de/SSLTBW_2.2.0/…
Tjad Clark
28

FILE* f = fdopen(d, "w");

man fdopen Ausgabe:

ZUSAMMENFASSUNG

#include <stdio.h>

FILE *
fdopen(int fildes, const char *mode);

Die fdopen()Funktion ordnet einen Stream dem vorhandenen Dateideskriptor zu fildes. Der Modus des Streams muss mit dem Modus des Dateideskriptors kompatibel sein. Wenn der Stream über geschlossen ist fclose(3), fildesist auch geschlossen.

Gregory Pakosz
quelle
1
Nicht verfügbar in ANSI C.
jww
Weitere Informationen finden
Sie unter
-7

Es gibt keine Standardmethode (oder umgekehrt), da der C-Standard nichts zu Dateideskriptoren zu sagen hat. Ihre spezifische Plattform kann einen solchen Mechanismus bereitstellen oder nicht.


quelle
17
Kommt darauf an, was du mit "Standard" meinst. POSIX ist ein Standard.
Richard Pennington
12
Die Frage betraf Dateideskriptoren. ;-)
Richard Pennington
11
@Neil> Die Frage, die als C markiert wird, bedeutet nicht "Sag mir die holly Wahrheit über den C-Standard", sondern "Ich codiere in C, ich mache das nicht, bitte sag mir, ob es möglich ist und wie? ""
Gregory Pakosz
8
Ich stimme zu, dass es keinen Standardweg gibt, aber die Erwähnung des OP mkstempimpliziert, dass nicht standardisierte Lösungen in diesem speziellen Fall akzeptabel sind. In diesem Fall hätte er jedoch das posixTag hinzufügen sollen (das, wie ich sehe, inzwischen hinzugefügt wurde).
Emerick Rogul
9
@Neil und der Zweck des Netzes und der Sinn des Lebens. Sie wären sinnvoller, wenn Sie gesagt hätten, dass Sie anderer Meinung sind. Ich bezweifle auch, dass es bei SO nur um Haarspalterei geht. Und es ist nicht sehr praktisch, sich auf die Tagging-Fähigkeiten von jemandem mit einer SO-Erfahrung zu verlassen, die dem Ruf von 23 entspricht.
Michael Krelin - Hacker