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

174

Ich habe eine FILE *, durch einen Anruf an zurückgegeben fopen(). Ich brauche einen Dateideskriptor, um Anrufe wie fsync(fd)darauf zu tätigen . Was ist die Funktion, um einen Dateideskriptor von einem Dateizeiger abzurufen?

Phil Miller
quelle
Oder Sie könnten die Datei mit open (2) öffnen, und Sie hätten von Anfang an einen Dateideskriptor
Antoine Pelisse

Antworten:

214

Die richtige Funktion ist int fileno(FILE *stream). Es befindet sich in <stdio.h>und ist ein POSIX-Standard, jedoch kein Standard C.

Phil Miller
quelle
4
Streng genommen müssten keine Header oder Bibliotheken erwähnt werden, wenn die Funktion tatsächlich Teil der Standard-C-Bibliothek wäre. Es ist jedoch kein Standard, weshalb es möglicherweise sinnvoll ist, zumindest den Header zu erwähnen.
Am
20
Für den Zugriff auf Funktionen in der Standard-C-Bibliothek müssen Header eingeschlossen werden, zumindest wenn Ihr Compiler Prototypen erwartet (ich kann mich nie daran erinnern, was diesbezüglich tatsächlich Standardverhalten ist). Ohne Header werden am Anfang einer C-Datei keine Namen definiert.
Phil Miller
1
@ Novelocrat: Ich wollte nicht, dass nichts nötig ist #include. Ich meinte nur, dass es immer einfach ist, den Namen des richtigen Headers für eine Standardfunktion zu finden . Das heißt, es ist nicht wirklich kritisch, den genauen Headernamen in der Antwort zu erwähnen.
Am
9
Dies ist eine gute Antwort, aber es ist erwähnenswert, dass dies keine Standard-C-Funktion ist, sondern eine Posix-Funktion.
Evan Teran
6
Es ist nicht im C-Standard enthalten, da Dateideskriptoren eine UNIX-Sache sind (unter Linux ist es offen (2), nicht offen (3)).
Nicht-Benutzer
42

Auch wenn fileno(FILE *)möglicherweise ein Dateideskriptor zurückgegeben wird, achten Sie SEHR darauf, den Puffer von stdio nicht zu umgehen. Wenn Pufferdaten vorhanden sind (entweder Lesen oder nicht geleertes Schreiben), können Lese- / Schreibvorgänge aus dem Dateideskriptor zu unerwarteten Ergebnissen führen.

Verwenden Sie, um eine der Nebenfragen zu beantworten und einen Dateideskriptor in einen DATEI-Zeiger zu konvertieren fdopen(3)

Mark Gerolimatos
quelle
1
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 OP-Beitrags beantwortet. Dies ist eher eine logische Klarstellung als echte Informationen.
Kevr
4
Kommentare, die so wichtig sind, müssen als Antworten angesprochen werden. Ein großer Prozentsatz der Kommentare sind snarky, sinnlose Metacomments wie Ihre ... und diese;)
Mark Gerolimatos