Chcę poznać różnicę między deskryptorem pliku a wskaźnikiem pliku.
Ponadto w jakim scenariuszu użyłbyś jednego zamiast drugiego?
c
file-descriptor
file-pointer
karthi_ms
źródło
źródło
Odpowiedzi:
Deskryptor pliku to „uchwyt” niskiego poziomu, będący liczbą całkowitą, używaną do identyfikacji otwartego pliku (lub gniazda, lub cokolwiek innego) na poziomie jądra, w Linuksie i innych systemach uniksopodobnych.
Zdasz „naked” deskryptorów plików do rzeczywistych połączeń, takich jak Unix
read()
,write()
i tak dalej.FILE
Wskaźnik jest C konstrukt standardowe na poziomie biblioteki, która służy do reprezentowania pliku.FILE
Owija deskryptor pliku i dodaje buforowanie i inne funkcje, aby wejść / wyjść łatwiejsze.Przekazujesz
FILE
wskaźniki do standardowych funkcji C, takich jakfread()
ifwrite()
.źródło
fd
jest pierwszym argumentem doread()
. Dlaczego nazywasz to nagim?FILE *
typem biblioteki standardowej , deskryptor pliku liczb całkowitych jest „mniej zawinięty”, tj. „Nagi”.Jeden jest buforowany (
FILE *
), a drugi nie. W praktyce chcesz używać goFILE *
prawie zawsze, gdy czytasz z „prawdziwego” pliku (tj. Na dysku), chyba że wiesz, co robisz lub jeśli twój plik jest gniazdem lub czymś podobnym.Możesz pobrać deskryptor pliku z
FILE *
usingfileno()
i możesz otworzyć buforowanyFILE *
z deskryptora pliku za pomocąfdopen()
źródło
Deskryptor pliku to po prostu liczba całkowita, którą otrzymujesz z
open()
wywołania POSIX . Używając standardowego Cfopen()
, otrzymujeszFILE
strukturę z powrotem. StrukturaFILE
zawiera ten deskryptor pliku, między innymi, takie jak koniec pliku i wskaźnik błędu, pozycja strumienia itp.Więc użycie
fopen()
daje pewną ilość abstrakcji w porównaniu zopen()
. Ogólnie powinieneś używać,fopen()
ponieważ jest to bardziej przenośne i możesz używać wszystkich innych standardowych funkcji C, które używająFILE
struktury struct, tj.fprintf()
I rodziny.Nie ma problemów z wydajnością przy użyciu.
źródło
Deskryptor pliku a wskaźnik pliku
Deskryptor pliku:
Deskryptor pliku to liczba całkowita zwracana przez
open()
wywołanie systemowe.int fd = open (filePath, mode);
Wskaźnik pliku:
Wskaźnik pliku jest wskaźnikiem do struktury C zwróconej przez
fopen()
funkcję biblioteczną, która służy do identyfikacji pliku, zawijania deskryptora pliku, funkcji buforowania i wszystkich innych funkcji potrzebnych do operacji we / wy . Wskaźnik pliku jest typu FILE , którego definicja można znaleźć w „/usr/include/stdio.h” . Ta definicja może się różnić w zależności od kompilatora.źródło
Chcesz dodać punkty, które mogą być przydatne.
O
FILE *
Używam go wiele razy do dzienników debugowania. przykład,
O
FILE DESCRIPTOR
Zwykle jest używany do IPC.
Daje niskopoziomową kontrolę nad plikami w systemach * nix. (Urządzenia, pliki, gniazda itp.), Przez co jest bardziej wydajny niż
FILE *
.źródło
fdopen()
do takich rzeczy, jak IPC i urządzeniaFILE*
?FILE*
, ale możesz utworzyćFILE*
z deskryptora pliku (fdopen()
), a późniejFILE
zamknąć również deskryptor. Dlatego możesz zrobić IPC, ale musisz trochę poradzić sobie z deskryptorami plików, aby ułatwić bezpośrednie IPC.FILE *
jest bardziej przydatna podczas pracy z plikami tekstowymi i wejściem / wyjściem, ponieważ pozwala na użycie funkcji API jaksprintf()
,sscanf()
,fgets()
,feof()
itdAPI deskryptora plików jest niskopoziomowe, więc pozwala na pracę z gniazdami, potokami, plikami mapowanymi w pamięci (i oczywiście zwykłymi plikami).
źródło
Tylko uwaga na zakończenie dyskusji (jeśli zainteresowany) ....
fopen
może być niezabezpieczone i prawdopodobnie powinieneś używaćfopen_s
lubopen
z ustawionymi na wyłączność bitami. C1X oferujex
tryby, dzięki czemu możnafopen
z trybów"rx"
,"wx"
itpJeśli używasz
open
, możesz rozważyćopen(..., O_EXCL | O_RDONLY,... )
lubopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
.Zobacz, na przykład, Nie rób założeń dotyczących fopen () i tworzenia plików .
źródło
fopen_s
nie wydaje się być dostępny zPOSIX
, zakładam, że najbardziej przenośnym soultion byłoby toopen(2)
i wtedyfdopen(2)
. (pozostawiając okna na bok). Co byłoby szybszefopen_s()
lub coopen(2)
nastąpiłoby po nimfdopen(2)
?Wywołania systemowe używają głównie deskryptora pliku, na przykład
read
iwrite
. Funkcja biblioteki użyje wskaźników plików (printf
,scanf
). Ale funkcje biblioteczne używają tylko wewnętrznych wywołań systemowych.źródło
Znalazłem dobre źródło tutaj , dając przegląd wysoki poziom różnic pomiędzy nimi:
źródło