2010-07-02 10 views
129

Mam FILE *, zwrócony przez połączenie pod numer fopen(). Muszę pobrać z niego deskryptor pliku, aby wykonywać na nim wywołania takie jak fsync(fd). Jaka jest funkcja uzyskania deskryptora pliku ze wskaźnika pliku?Jak przekonwertować wskaźnik pliku (FILE * fp) na deskryptor pliku (int fd)?

+7

Self-odpowiedź w tym „niebezpieczeństwie” formy są zachęcani. – dmckee

+0

Lub możesz otworzyć plik z open (2), a będziesz mieć deskryptor pliku od początku –

+6

I odwrotnie: [Jak uzyskać wskaźnik PLIKU z deskryptora pliku?] (Http://stackoverflow.com/ pytania/1941464/how-to-get-a-file-pointer-from-a-file-descriptor) –

Odpowiedz

168

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

+4

Ściśle mówiąc, nie byłoby potrzeby wspominania o żadnych nagłówkach lub bibliotekach, jeśli funkcja rzeczywiście była częścią standardowego Biblioteka C Jednak nie jest to standard, dlatego warto wspomnieć przynajmniej nagłówek. – AnT

+16

Dostęp do funkcji w standardowej bibliotece C wymaga włączenia nagłówków, przynajmniej jeśli twój kompilator oczekuje prototypów (nigdy nie pamiętam, co jest w rzeczywistości standardowym zachowaniem w tym zakresie). Bez nagłówków żadne nazwy nie są zdefiniowane na początku pliku C. – Novelocrat

+0

@Novelocrat: Nie miałem na myśli, że nie ma potrzeby "# include" niczego. Miałem tylko na myśli, że zawsze łatwo jest znaleźć nazwę odpowiedniego nagłówka dla funkcji * standardowej *. To znaczy. nie jest bardzo ważne, aby podać dokładną nazwę nagłówka w odpowiedzi. – AnT

27

Nawet jeśli fileno(FILE *) może zwrócić deskryptor pliku, bądź BARDZO ostrożny, aby nie ominąć bufora stdio. Jeśli istnieją dane buforowe (odczyt odczytywany lub nieopróżniony), odczyt/zapis z deskryptora pliku może dać nieoczekiwane wyniki.

Aby odpowiedzieć na jedno z pytań bocznych, przekształcić deskryptor do wskaźnika pliku, użyj fdopen(3)

+0

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

Powiązane problemy