Ich möchte den Unterschied zwischen einem Dateideskriptor und einem Dateizeiger wissen.
Außerdem, in welchem Szenario würden Sie das eine anstelle des anderen verwenden?
karthi_ms
Ich möchte den Unterschied zwischen einem Dateideskriptor und einem Dateizeiger wissen.
Außerdem, in welchem Szenario würden Sie das eine anstelle des anderen verwenden?
entspannen
Ein Dateideskriptor ist ein ganzzahliges “Handle” auf niedriger Ebene, das verwendet wird, um eine geöffnete Datei (oder einen Socket oder was auch immer) auf Kernelebene in Linux und anderen Unix-ähnlichen Systemen zu identifizieren.
Sie übergeben “nackte” Dateideskriptoren an tatsächliche Unix-Aufrufe, wie z read()
, write()
usw.
EIN FILE
pointer ist ein C-Standardkonstrukt auf Bibliotheksebene, das verwendet wird, um eine Datei darzustellen. Das 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ür read()
. 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 gut 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()
Anruf. Unter Verwendung des Standard-C fopen()
du bekommst ein FILE
Struktur zurück. Das 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);
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;
Möchten Sie Punkte hinzufügen, die nützlich sein könnten.
UM FILE *
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 machen FILE*
?
– 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 erstellen FILE*
aus einem Dateideskriptor (fdopen()
) und später das Schließen der FILE
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 machen FILE*
?
– 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 erstellen FILE*
aus einem Dateideskriptor (fdopen()
) und später das Schließen der FILE
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"
etc.
Wenn du benutzt open
könnten Sie in Erwägung 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.
Wie fopen_s
scheint nicht verfügbar zu sein POSIX
Ich nehme an, die tragbarste Lösung wäre zu open(2)
und dann fdopen(2)
. (Fenster beiseite lassen). Außerdem, was wäre schneller fopen_s()
oder open(2)
gefolgt von fdopen(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