Ich möchte den Unterschied zwischen einem Dateideskriptor und einem Dateizeiger kennen.
In welchem Szenario würden Sie auch eines anstelle des anderen verwenden?
c
file-descriptor
file-pointer
karthi_ms
quelle
quelle
Antworten:
Ein Dateideskriptor ist ein ganzzahliges "Handle" auf niedriger Ebene, mit dem eine geöffnete Datei (oder ein Socket oder was auch immer) auf Kernelebene unter Linux und anderen Unix-ähnlichen Systemen identifiziert wird.
Sie passieren „nackt“ Dateideskriptoren tatsächliche Unix Anrufe, wie
read()
,write()
und so weiter.Ein
FILE
Zeiger ist ein C-Standardkonstrukt auf Bibliotheksebene, das zur Darstellung einer Datei verwendet wird. DasFILE
umschließt den Dateideskriptor und fügt Pufferung und andere Funktionen hinzu, um die E / A zu vereinfachen.Sie übergeben
FILE
Zeiger auf Standard-C-Funktionen wiefread()
undfwrite()
.quelle
fd
das erste Argument istread()
. Warum nennst du es nackt?FILE *
Typ der Standardbibliothek ist der Integer-Dateideskriptor "weniger umbrochen", dh "nackt".Einer ist gepuffert (
FILE *
) und der andere nicht. In der Praxis möchten SieFILE *
fast immer verwenden, wenn Sie aus einer "echten" Datei (dh auf dem Laufwerk) lesen, es sei denn, Sie wissen, was Sie tun, oder Ihre Datei ist tatsächlich ein Socket oder so.Sie können den Dateideskriptor mit
FILE *
using abrufenfileno()
und einen gepuffertenFILE *
Dateideskriptor mit using öffnenfdopen()
quelle
Ein Dateideskriptor ist nur eine Ganzzahl, die Sie aus dem POSIX-
open()
Aufruf erhalten. Mit dem Standard C erhaltenfopen()
Sie eineFILE
Struktur zurück. DieFILE
Struktur enthält diesen Dateideskriptor unter anderem wie Dateiende- und Fehleranzeige, Stream-Position usw.fopen()
Wenn Sie also verwenden, erhalten Sie im Vergleich zu eine gewisse Abstraktionopen()
. Im Allgemeinen sollten Sie verwenden,fopen()
da dies portabler ist und Sie alle anderen Standard-C-Funktionen verwenden können, die dieFILE
Struktur, dhfprintf()
und die Familie verwenden.Es gibt auch keine Leistungsprobleme bei der Verwendung.
quelle
Dateideskriptor vs Dateizeiger
Dateideskriptor:
Der Dateideskriptor ist ein ganzzahliger Wert, der vom
open()
Systemaufruf zurückgegeben wird.int fd = open (filePath, mode);
Dateizeiger:
Der Dateizeiger ist ein Zeiger auf eine C-Struktur, die von der
fopen()
Bibliotheksfunktion zurückgegeben wird. Er dient zum Identifizieren einer Datei, zum Umschließen des Dateideskriptors, zum Puffern und für alle anderen Funktionen, die für die E / A-Operation erforderlich sind. Der Dateizeiger ist vom Typ FILE , dessen Definition finden Sie in "/usr/include/stdio.h" . Diese Definition kann von Compiler zu Compiler unterschiedlich sein.quelle
Möchten Sie Punkte hinzufügen, die nützlich sein könnten.
ÜBER
FILE *
Ich benutze es oft für Debug-Protokolle. Beispiel,
ÜBER
FILE DESCRIPTOR
Es wird im Allgemeinen für IPC verwendet.
Ermöglicht die einfache Steuerung von Dateien auf * nix-Systemen (Geräte, Dateien, Sockets usw.) und ist daher leistungsfähiger als die
FILE *
.quelle
fdopen()
nicht Dinge wie IPC und Geräte mit tunFILE*
?FILE*
, aber Sie können einenFILE*
aus einem Dateideskriptor (fdopen()
) erstellen und später schließenFILE
, um den Deskriptor ebenfalls zu schließen. Daher können Sie IPC ausführen, müssen sich jedoch ein wenig mit Dateideskriptoren befassen, um einen direkten IPC zu ermöglichen.FILE *
ist nützlich , wenn Sie mit Textdateien und Benutzereingabe / Ausgabe arbeiten, weil es Ihnen wie API - Funktionen verwenden kannsprintf()
,sscanf()
,fgets()
,feof()
usw.Die Dateideskriptor-API ist auf niedriger Ebene und ermöglicht daher die Arbeit mit Sockets, Pipes, Dateien mit Speicherzuordnung (und natürlich mit regulären Dateien).
quelle
Nur eine Notiz zum Abschluss der Diskussion (falls interessiert) ....
fopen
kann unsicher sein, und Sie sollten wahrscheinlichfopen_s
oderopen
mit exklusiven gesetzten Bits verwenden. C1X bietetx
Modi, so können Siefopen
mit Modi"rx"
,"wx"
usw.Wenn Sie verwenden
open
, könnten Sieopen(..., O_EXCL | O_RDONLY,... )
oder in Betracht ziehenopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
.Siehe zum Beispiel: Machen Sie keine Annahmen über fopen () und die Dateierstellung .
quelle
fopen_s
es anscheinend nicht verfügbar istPOSIX
, gehe ich davon aus, dass die tragbarste Lösung füropen(2)
und dann istfdopen(2)
. (Fenster beiseite lassen). Was wäre schnellerfopen_s()
oderopen(2)
gefolgt vonfdopen(2)
?Systemaufrufe verwenden zum Beispiel meistens den Dateideskriptor
read
undwrite
. Die Bibliotheksfunktion verwendet die Dateizeiger (printf
,scanf
). Bibliotheksfunktionen verwenden jedoch nur interne Systemaufrufe.quelle
Ich habe hier eine gute Ressource gefunden , die einen umfassenden Überblick über die Unterschiede zwischen den beiden gibt:
quelle