Jak uzyskać wskaźnik FILE z deskryptora pliku?

Odpowiedzi:

101

Zastosowanie fdopen():

FILE* fp = fdopen(fd, "w");
Richarda Penningtona
źródło
34
Aby uzyskać deskryptor pliku z PLIKU *, użyj fileno(): linux.die.net/man/3/fileno
Lee Netherton,
2
jeśli fdzostał otwarty z niektórymi flagami (jak O_NONBLOCK) - co się z nimi stanie po fdopenotwarciu z nowymi flagami? Czy zostaną xorpołączone czy zastąpione?
xealits
5
@jww: Deskryptory plików nie są w formacie ANSI C.
Rufflewind
2
czy w jakikolwiek sposób jest źle dzwonić fdopenwiele razy? (zakładając, że dzieje się to wewnątrz jakiejś funkcji, która jest
ciągle wywoływana
2
@xealits Opcje PLIKU * muszą mieścić się w zakresie już otwartego deskryptora pliku. Więc jeśli otworzyłeś fd tylko do odczytu, a PLIK * tylko do zapisu, powinien zgłosić wyjątek. Więcej informacji można znaleźć na stronie ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark
28

FILE* f = fdopen(d, "w");

man fdopen wyjście:

STRESZCZENIE

#include <stdio.h>

FILE *
fdopen(int fildes, const char *mode);

fdopen()Funkcja wiąże strumień z istniejącym deskryptorze pliku fildes. Tryb strumienia musi być zgodny z trybem deskryptora pliku. Kiedy strumień jest zamknięty przez fclose(3), fildesjest również zamknięty.

Gregory Pakosz
źródło
1
Niedostępne w ANSI C.
jww
Więcej informacji można znaleźć na stronie ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/ ...
Tjad Clark,
-8

Nie ma standardowego sposobu, aby to zrobić (lub odwrotnie), ponieważ standard C nie ma nic do powiedzenia na temat deskryptorów plików. Twoja konkretna platforma może lub nie zapewniać takiego mechanizmu.


źródło
17
Zależy od tego, co rozumiesz przez „standard”. POSIX to standard.
Richard Pennington,
12
Pytanie dotyczyło deskryptorów plików. ;-)
Richard Pennington
11
@Neil> pytanie oznaczone jako C nie oznacza „powiedz mi całą prawdę o standardzie C”, ale raczej „Koduję w C, nie udaje mi się to, proszę mi powiedzieć, czy jest to możliwe i jak? "
Gregory Pakosz
8
Zgadzam się, że nie ma na to standardowego sposobu, ale wzmianka w OP mkstempsugeruje, że niestandardowe rozwiązania są dopuszczalne w tym konkretnym przypadku. W takim przypadku jednak powinien był dodać posixtag (który, jak widzę, został już dodany).
Emerick Rogul
9
@Neil oraz cel sieci i sens życia. Miałbyś więcej sensu, gdybyś powiedział, że masz inne zdanie. Wątpię też, żeby w SO chodziło o rozwiązywanie włosów nad standardami. I nie jest zbyt praktyczne poleganie na oznaczaniu umiejętności kogoś z doświadczeniem SO odpowiadającym reputacji 23.
Michael Krelin - haker