Was ist der Unterschied zwischen einem Dateideskriptor und einem Dateizeiger?

Lesezeit: 5 Minuten

Benutzeravatar von karthi_ms
karthi_ms

Wie hängen Dateideskriptoren und Dateizeiger zusammen? Wann ist es angemessen, sie zu verwenden?

Benutzeravatar von unwind
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ü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 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

Bens Benutzeravatar
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

Benutzeravatar von Martin Wickman
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);

  1. Handler auf niedriger/Kernel-Ebene.
  2. passe zu read() und write() von UNIX-Systemaufrufen.
  3. Enthält keine Pufferung und solche Funktionen.
  4. 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;
  1. Es ist eine High-Level-Schnittstelle.
  2. Wird an die Funktionen fread() und fwrite() übergeben.
  3. Beinhaltet Pufferung, Fehleranzeige und EOF-Erkennung usw.
  4. Bietet höhere Portabilität und Effizienz.

Möchten Sie Punkte hinzufügen, die nützlich sein könnten.

UM FILE *

  1. kann nicht für die Interprozesskommunikation (IPC) verwendet werden.
  2. Verwenden Sie es, wenn Sie gepufferte E / A für allgemeine Zwecke benötigen. (printf, frpintf, snprintf, scanf)
  3. 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

  1. Es wird im Allgemeinen für IPC verwendet.

  2. 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"usw.

Wenn du benutzt openkö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 sein POSIXIch 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

1444250cookie-checkWas ist der Unterschied zwischen einem Dateideskriptor und einem Dateizeiger?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy