Wie hängen Dateideskriptoren und Dateizeiger zusammen? Wann ist es angemessen, sie zu verwenden?
Was ist der Unterschied zwischen einem Dateideskriptor und einem Dateizeiger?
karthi_ms
entspannen
Ein Dateideskriptor ist ein Low-Level-Integer-“Handle”, das verwendet wird, um eine geöffnete Datei (oder einen Socket oder was auch immer) auf Kernel-Ebene in Linux und anderen Unix-ähnlichen Systemen zu identifizieren.
Sie übergeben “nackte” Dateideskriptoren an tatsächliche Unix-Aufrufe, wie z read()
, write()
usw.
A FILE
pointer ist ein C-Standardkonstrukt auf Bibliotheksebene, das verwendet wird, um eine Datei darzustellen. Der FILE
umschließt den Dateideskriptor und fügt Pufferung und andere Funktionen hinzu, um die E/A zu vereinfachen.
Du passierst FILE
Zeiger auf Standard-C-Funktionen wie z fread()
Und fwrite()
.
-
@nvl: fildes ist sicherlich für Windows verfügbar, zB msdn.microsoft.com/en-us/library/z0kc8e3z%28VS.80%29.aspx
– kennytm
11. März 2010 um 9:16 Uhr
-
@unwind Was hast du mit “nackten” Dateideskriptoren gemeint? Die verlinkte Referenz sagt, dass die
fd
ist das erste Argument dafürread()
. Warum nennst du es nackt?– Aussenseiter
27. Juli 2014 um 9:37 Uhr
-
@Geek Im Vergleich zur Standardbibliothek
FILE *
Typ ist der Integer-Dateideskriptor “weniger verpackt”, dh “nackt”.– abschalten
30. Juli 2014 um 16:40 Uhr
-
Während dieser Kommentar maßgeblich klingt (und das könnte er sehr wohl sein), fand ich die Kommentare von Suraj Jain und Vogeesh HT informativer und lieferten ein notwendiges Maß an Details, das in den anderen Kommentaren nicht verfügbar war.
– Stato Machino
20. Juli 2021 um 3:58 Uhr
Ben
Einer ist gepuffert (FILE *
) und der andere nicht. In der Praxis möchten Sie verwenden FILE *
fast immer, wenn Sie aus einer “echten” Datei lesen (dh auf dem Laufwerk), es sei denn, Sie wissen, was Sie tun, oder es sei denn, Ihre Datei ist tatsächlich ein Socket oder so.
Sie können den Dateideskriptor aus der FILE *
verwenden fileno()
und Sie können eine gepufferte öffnen FILE *
aus einem Dateideskriptor mit fdopen()
-
+1 für den Hinweis auf fileno(), die Organisation der Manpages macht es schwierig, diese zu finden. Gleiches gilt für fdopen().
– BD in Rivenhill
30. April 2010 um 16:29 Uhr
Martin Wickmann
Ein Dateideskriptor ist nur eine Ganzzahl, die Sie von POSIX erhalten open()
Forderung. Unter Verwendung des Standard-C fopen()
du bekommst ein FILE
Struktur zurück. Der FILE
struct enthält diesen Dateideskriptor unter anderem wie Dateiende- und Fehleranzeige, Stream-Position etc.
Also verwenden fopen()
gibt Ihnen ein gewisses Maß an Abstraktion im Vergleich zu open()
. Im Allgemeinen sollten Sie verwenden fopen()
da das portabler ist und Sie alle anderen Standard-C-Funktionen verwenden können, die das verwendet FILE
Struktur, dh fprintf()
und Familie.
Es gibt auch keine Leistungsprobleme bei der Verwendung.
-
+1 für die Hervorhebung der Portabilität. FILE ist Teil der Standard-C-Bibliothek (zurück zu C89/C90); Dateideskriptoren sind es nicht.
– Tomlogik
11. März 2010 um 17:42 Uhr
Dateideskriptor vs. Dateizeiger
Dateideskriptor:
Der Dateideskriptor ist ein ganzzahliger Wert, der von zurückgegeben wird open()
Systemaufruf.
int fd = open (filePath, mode);
- Handler auf niedriger/Kernel-Ebene.
- passe zu read() und write() von UNIX-Systemaufrufen.
- Enthält keine Pufferung und solche Funktionen.
- Weniger tragbar und nicht effizient.
Dateizeiger:
File Pointer ist ein Zeiger auf eine C-Struktur, die von zurückgegeben wird fopen()
Bibliotheksfunktion, die verwendet wird Identifizieren einer Datei, Umschließen des Dateideskriptors, Pufferfunktionalität und alle anderen für die E/A-Operation erforderlichen Funktionen.Der Dateizeiger ist vom Typ DATEIdessen Definition in zu finden ist “/usr/include/stdio.h”. Diese Definition kann von einem Compiler zum anderen variieren.
FILE *fp = fopen (filePath, mode);
// A FILE Structure returned by fopen
typedef struct
{
unsigned char *_ptr;
int _cnt;
unsigned char *_base;
unsigned char *_bufendp;
short _flag;
short _file;
int __stdioid;
char *__newbase;
#ifdef _THREAD_SAFE
void *_lock;
#else
long _unused[1];
#endif
#ifdef __64BIT__
long _unused1[4];
#endif /* __64BIT__ */
} FILE;
- Es ist eine High-Level-Schnittstelle.
- Wird an die Funktionen fread() und fwrite() übergeben.
- Beinhaltet Pufferung, Fehleranzeige und EOF-Erkennung usw.
- Bietet höhere Portabilität und Effizienz.
Möchten Sie Punkte hinzufügen, die nützlich sein könnten.
UM FILE *
- kann nicht für die Interprozesskommunikation (IPC) verwendet werden.
- Verwenden Sie es, wenn Sie gepufferte E / A für allgemeine Zwecke benötigen. (printf, frpintf, snprintf, scanf)
-
Ich verwende es oft für Debug-Protokolle. Beispiel,
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
UM FILE DESCRIPTOR
-
Es wird im Allgemeinen für IPC verwendet.
-
Gibt Dateien auf * nix-Systemen (Geräte, Dateien, Sockets usw.) eine Kontrolle auf niedriger Ebene und ist daher leistungsfähiger als die
FILE *
.
-
Kannst du nicht verwenden
fdopen()
um Dinge wie IPC und Geräte damit zu machenFILE*
?– osven
21. März 2017 um 13:47 Uhr
-
Eigentlich ja und nein. Sie können IPC nicht mit einrichten und initialisieren
FILE*
aber Sie können eine erstellenFILE*
aus einem Dateideskriptor (fdopen()
) und später das Schließen derFILE
schließt auch den Deskriptor. Daher können Sie Tun IPC, aber Sie müssen sich ein wenig mit Dateideskriptoren befassen, um einen direkten IPC zu ermöglichen.– Micha W
10. Januar 2018 um 22:55 Uhr
FILE *
ist nützlicher, wenn Sie mit Textdateien und Benutzereingaben/-ausgaben arbeiten, da Sie API-Funktionen wie verwenden können sprintf()
, sscanf()
, fgets()
, feof()
usw.
Die Dateideskriptor-API ist Low-Level, sodass Sie mit Sockets, Pipes, speicherabgebildeten Dateien (und natürlich regulären Dateien) arbeiten können.
-
Kannst du nicht verwenden
fdopen()
um Dinge wie IPC und Geräte damit zu machenFILE*
?– osven
21. März 2017 um 13:47 Uhr
-
Eigentlich ja und nein. Sie können IPC nicht mit einrichten und initialisieren
FILE*
aber Sie können eine erstellenFILE*
aus einem Dateideskriptor (fdopen()
) und später das Schließen derFILE
schließt auch den Deskriptor. Daher können Sie Tun IPC, aber Sie müssen sich ein wenig mit Dateideskriptoren befassen, um einen direkten IPC zu ermöglichen.– Micha W
10. Januar 2018 um 22:55 Uhr
Nur eine Anmerkung zum Abschluss der Diskussion (bei Interesse)….
fopen
kann unsicher sein, und Sie sollten wahrscheinlich verwenden fopen_s
oder open
mit gesetzten exklusiven Bits. C1X bietet x
Modi, damit Sie können fopen
mit Modi "rx"
, "wx"
usw.
Wenn du benutzt open
könnten Sie in Betracht ziehen open(..., O_EXCL | O_RDONLY,... )
oder open(..., O_CREAT | O_EXCL | O_WRONLY,... )
.
Siehe zum Beispiel Machen Sie keine Annahmen über fopen() und die Dateierstellung.
-
Als
fopen_s
scheint nicht verfügbar zu seinPOSIX
Ich nehme an, die tragbarste Lösung wäre zuopen(2)
und dannfdopen(2)
. (Fenster beiseite lassen). Außerdem, was wäre schnellerfopen_s()
oderopen(2)
gefolgt vonfdopen(2)
?– Mihir Luthra
10. August 2019 um 18:08 Uhr
gnu.org/software/libc/manual/html_node/…
– Suraj Jain
14. Dezember 2019 um 9:50 Uhr