Jak mogę przekonwertować wskaźnik pliku (FILE * fp) na deskryptor pliku (int fd)?


174

Mam FILE *, zwrócony telefonem do fopen(). Potrzebuję z niego deskryptora pliku, aby wykonywać takie wywołania fsync(fd). Jaka jest funkcja uzyskiwania deskryptora pliku ze wskaźnika pliku?


Lub możesz otworzyć plik za pomocą open (2) i miałbyś deskryptor pliku od początku
Antoine Pelisse

Odpowiedzi:


214

Właściwa funkcja to int fileno(FILE *stream). Można go znaleźć w <stdio.h>standardzie POSIX, ale nie w standardzie C.


4
Ściśle mówiąc, nie byłoby potrzeby wspominania o żadnych nagłówkach ani bibliotekach, gdyby funkcja była rzeczywiście częścią standardowej biblioteki C. Nie jest to jednak standard, dlatego warto przynajmniej wspomnieć o nagłówku.
AnT

20
Dostęp do funkcji w standardowej bibliotece C wymaga dołączenia nagłówków, przynajmniej jeśli Twój kompilator oczekuje prototypów (nigdy nie pamiętam, jakie właściwie jest standardowe zachowanie w tym zakresie). Bez nagłówków żadne nazwy nie są zdefiniowane na początku pliku C.
Phil Miller,

1
@Novelocrat: Nie miałem na myśli, że #includeniczego nie trzeba . Miałem po prostu na myśli to, że zawsze łatwo jest znaleźć nazwę odpowiedniego nagłówka dla standardowej funkcji. Oznacza to, że podanie dokładnej nazwy nagłówka w odpowiedzi nie jest naprawdę ważne.
AnT

9
To dobra odpowiedź, ale warto zauważyć, że nie jest to standardowa funkcja c, tylko funkcja posix.
Evan Teran,

6
Nie jest w standardzie C, ponieważ deskryptory plików są rzeczą UNIX-ową (w Linuksie jest otwarta (2), a nie otwarta (3)).
not-a-user

42

Nawet jeśli fileno(FILE *)może zwrócić deskryptor pliku, BARDZO uważaj, aby nie ominąć bufora stdio. Jeśli istnieją dane bufora (do odczytu lub zapisu bez zaznaczenia), odczyty / zapisy z deskryptora pliku mogą dać nieoczekiwane wyniki.

Aby odpowiedzieć na jedno z pytań pobocznych, aby przekonwertować deskryptor pliku na wskaźnik FILE, użyj fdopen(3)


1
Nie sądzę, aby było to pomocne dla osób szukających tego konkretnie, a odpowiedź na to pytanie została już udzielona w sekcji komentarzy w poście OP na miesiąc przed napisaniem tego. Jest to bardziej logiczne wyjaśnienie, w przeciwieństwie do prawdziwych informacji.
kevr

4
Komentarze, które są baaaardzo ważne, należy zgłaszać jako odpowiedzi. Ogromny procent komentarze są snarky, bezsensowne metacomments jak Twoja ... i ten jeden;)
Mark Gerolimatos
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.