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?
Ś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)
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;)
Odpowiedzi:
Właściwa funkcja to
int fileno(FILE *stream)
. Można go znaleźć w<stdio.h>
standardzie POSIX, ale nie w standardzie C.źródło
#include
niczego 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.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)
źródło