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?


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.


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)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.