Dateideskriptor

Im Unix und Unix-artig Computerbetriebssysteme, a Dateideskriptor (FD, seltener Fildes) ist eine eindeutige Kennung (handhaben) Für ein Datei oder andere Input-Output Ressource, so wie ein Rohr oder Netzwerkbuchse.

Dateideskriptoren haben normalerweise nicht negative Ganzzahlwerte, wobei negative Werte reserviert werden, um "NO-Wert" oder Fehlerbedingungen anzuzeigen.

Dateideskriptoren sind Teil der Posix API. Jede Unix Prozess (außer vielleicht Daemons) sollten drei Standard -POSIX -Dateideskriptoren haben, die den drei entsprechen Standardströme:

Integer Wert Name <Unistd.h> Symbolische Konstante[1] <stdio.h> Datenfluss[2]
0 Standardeingabe Stdin_fileno Stdin
1 Standardausgabe Stdout_fileno Stdout
2 Standart Fehler Stderr_fileno Stderr

Überblick

Dateideskriptoren für einen einzelnen Prozess, Dateitabelle und Inode Tisch. Beachten Sie, dass mehrere Dateideskriptoren auf dieselbe Datei -Tabelleneingabe verweisen können (z. DUP Systemanruf[3]: 104) und dass mehrere Datei -Tabelleneinträge sich wiederum auf denselben Inode beziehen können (wenn sie mehrmals geöffnet wurde; die Tabelle wird immer noch vereinfacht, da sie Inodes durch Dateinamen darstellt, obwohl ein Inode haben kann Mehrere Namen). Dateideskriptor 3 bezieht sich in der Dateitabelle nicht auf etwas, was bedeutet, dass er geschlossen wurde.

In der traditionellen Implementierung von UNIX indexieren die Dateideskriptoren in einen prozess Dateideskriptortabelle verwaltet vom Kernel, das wiederum zu einer systemweiten Tabelle der Dateien wird, die von allen Prozessen geöffnet werden, die als die genannt werden Dateitabelle. Diese Tabelle erfasst die Modus mit der die Datei (oder andere Ressource) geöffnet wurde: zum Lesen, Schreiben, Anhängen und möglicherweise anderer Modi. Es zeigt auch eine dritte Tabelle namens The Inode -Tabelle Das beschreibt die tatsächlichen zugrunde liegenden Dateien.[3] Um Eingaben oder Ausgabe auszuführen, übergibt der Prozess den Dateideskriptor über a an den Kernel Systemanrufund der Kernel wird im Namen des Prozesses auf die Datei zugreifen. Der Prozess hat keinen direkten Zugriff auf die Datei- oder Inode -Tabellen.

An LinuxAuf die in einem Prozess geöffnete Dateideskriptoren können unter dem Pfad zugegriffen werden /proc/pid/fd/, wo PID das ist Prozesskennung. Dateideskriptor /proc/pid/fd/0 ist Stdin, /proc/pid/fd/1 ist Stdout, und /proc/pid/fd/2 ist Stderr. Als Abkürzung zu diesen kann auch jeder laufende Prozess zugreifen sein eigenes Dateideskriptoren über die Ordner /proc/self/fd und /dev/fd.[4]

Im Unix-artig Systeme, Dateideskriptoren können sich auf jeden beziehen UNIX -Dateityp in einem Dateisystem benannt. Dazu gehört auch reguläre Dateien Verzeichnisse, Block und Charaktergeräte (auch als "spezielle Dateien" bezeichnet), UNIX -Domain -Sockets, und benannte Pfeifen. Dateideskriptoren können auch auf andere Objekte verweisen, die normalerweise im Dateisystem nicht vorhanden sind, z. B. Anonyme Rohre und Netzwerkstücken.

Die Dateidatenstruktur in der C Standard -E/A -Bibliothek In der Regel enthält ein Dateideskriptor für niedrige Ebene für das fragliche Objekt auf Unix-ähnlichen Systemen. Die Gesamtdatenstruktur liefert zusätzliche Abstraktion und wird stattdessen als als bezeichnet Datei handhaben.

Operationen auf Dateideskriptoren

Die folgenden Auflistung typischer Operationen in Dateideskriptoren auf Modern Unix-artig Systeme. Die meisten dieser Funktionen werden in der deklariert Kopfball, aber einige sind in der Header stattdessen.

Dateideskriptoren erstellen

  • offen()
  • creat ()[5]
  • Steckdose()
  • annehmen()
  • Socketpair ()
  • Rohr()
  • epoll_create () (Linux)
  • Signalfd () (Linux)
  • eventfd () (Linux)
  • timerfd_create () (Linux)
  • memfd_create () (Linux)
  • userfaultfd () (Linux)
  • fanotify_init () (Linux)
  • Inotify_init () (Linux)
  • Klon() (mit Flag Clone_pidfd, Linux)
  • pidfd_open () (Linux)
  • open_by_handle_at () (Linux)

Dateideskriptoren abgeben

  • Dirfd ()
  • Fileno ()

Vorgänge auf einem einzelnen Dateideskriptor

  • lesen(),, schreiben()
  • Readv (), writev ()
  • pread (), PWRITE ()
  • recv (), senden()
  • recvfrom (), senden an()
  • recvmsg (), sendmsg () (Wird auch zum Senden von FDS an andere Prozesse über einen UNIX -Domänenbuchse verwendet)
  • recvmmsg (), sendmmsg ()
  • lseek (), llseek ()
  • fstat ()
  • fstatvfs ()
  • fchmod ()
  • fchown ()
  • ftruncate ()
  • fsync ()
  • fdatasync ()
  • fdopendir ()
  • fGetxattr (), fsetxattr () (Linux)
  • flistxattr (), Fremovexattr () (Linux)
  • StatX (Linux)
  • setns (Linux)
  • vmSplice () (Linux)
  • pidfd_send_signal () (Linux)
  • waitid () (mit P_PIDFD -ID -Typ, Linux)
  • fdopen () (STDIO -Funktion: Konvertiert den Dateideskriptor in Datei*)
  • dprintf () (STDIO -Funktion: Drucke zum Dateideskriptor)

Vorgänge auf mehreren Dateideskriptoren

  • auswählen(), pSelect ()
  • Umfrage(), ppoll ()
  • epoll_wait (), epoll_pwait (), epoll_pwait2 () (Linux, nimmt eine einzelne Epoll -Anmeldeskriptorin, um auf vielen anderen Dateideskriptoren zu warten.)
  • epoll_ctl () (für Linux)
  • kqueue () (für BSD-basierte Systeme).
  • Datei senden()
  • spleißen(), tee () (für Linux)
  • copy_file_range () (für Linux)
  • kurze Reichweite() (für Linux)[6]

Vorgänge in der Dateideskriptorentabelle

Das fcntl () Die Funktion wird verwendet, um verschiedene Operationen in einem Dateideskriptor auszuführen, abhängig vom an ihn übergebenen Befehlsargument. Es gibt Befehle, mit denen Attribute abgerufen und festgelegt werden können, die einem Dateideskriptor zugeordnet sind, einschließlich F_getfd, f_setfd, f_getfl und F_setfl.

  • nah dran()
  • CloseFrom () (Nur BSD und Solaris; löscht alle Dateideskriptoren größer oder gleich der angegebenen Zahl)
  • DUP () (Dupliziert einen vorhandenen Dateideskriptor, der garantiert, dass es sich um die niedrigste verfügbare Dateideskriptor handelt.)
  • DUP2(), DUP3 () (Schließen Sie fd1 gegebenenfalls und lassen Sie den Dateideskriptor FD1 auf die geöffnete Datei von FD2 verweisen)
  • fcntl (f_dupfd)

Vorgänge, die den Prozesszustand ändern

  • fchdir () (Legt das aktuelle Arbeitsverzeichnis des Prozesses basierend auf einem Verzeichnisdateideskriptor fest)
  • MMAP() (Kartenbereiche einer Datei in den Adressraum des Prozesses)

Dateisperrung

  • Herde()
  • fcntl () (f_getlk, f_setlk und F_setlkw)
  • lockf ()

Steckdosen

  • verbinden()
  • binden()
  • Hören()
  • annehmen() (Erstellt einen neuen Dateideskriptor für eine eingehende Verbindung)
  • GETOCKNAME ()
  • GetPeername ()
  • getockopt ()
  • setSockopt ()
  • stilllegen() (Schließen Sie eine oder beide Hälften einer vollständigen Duplex -Verbindung ab)

Sonstig

  • ioctl () (Eine große Sammlung verschiedener Operationen auf einem einzelnen Dateideskriptor, der häufig einem Gerät zugeordnet ist)

Bevorstehende Operationen

Eine Reihe neuer Vorgänge in Dateideskriptoren wurde zu vielen modernen Unix-ähnlichen Systemen sowie zahlreichen C-Bibliotheken hinzugefügt, um in einer zukünftigen Version von standardisiert zu werden Posix.[7] Das bei Suffix bedeutet, dass die Funktion ein zusätzliches erstes Argument mit einem Dateideskriptor annimmt relative Pfade werden gelöst, die Formen, denen es fehlt bei Suffix wird damit gleichwertig dem Übergeben eines Dateideskriptors, der dem Strom entspricht Arbeitsverzeichnis. Der Zweck dieser neuen Operationen ist es, sich gegen eine bestimmte Klasse von zu verteidigen Tactou Anschläge.

  • openat ()
  • faccessat ()
  • fchmodat ()
  • fchownat ()
  • fstatat ()
  • futimesat ()
  • linkat ()
  • mkdirat ()
  • Mknodat ()
  • ReadLinkat ()
  • umbenennen ()
  • symlinkat ()
  • Unlinkat ()
  • mkfifoat ()
  • fdopendir ()

Dateideskriptoren als Funktionen

Unix -Dateideskriptoren verhalten sich in vielerlei Hinsicht als Fähigkeiten. Sie können zwischen den Prozessen hinweg verabschiedet werden UNIX -Domain -Sockets Verwendung der sendmsg () Systemanruf. Beachten Sie jedoch, dass das, was tatsächlich übergeben wird, ein Verweis auf eine "Öffnen der Dateibeschreibung" ist, die einen veränderlichen Status hat (den Dateiversatz und den Dateistatus und den Zugriffsflags). Dies kompliziert die sichere Verwendung von Dateideskriptoren als Funktionen, da die Programme, wenn Programme den Zugriff auf dieselbe offene Dateibeschreibung teilen, die Verwendung des anderen beeinträchtigen können, indem sie den Offset ändern oder ob sie beispielsweise blockiert oder nicht blockiert werden.[8][9] In Betriebssystemen, die speziell als Fähigkeitssysteme ausgelegt sind, gibt es sehr selten jeden veränderlichen Zustand, der mit einer Fähigkeit selbst verbunden ist.

Eine Unix -Prozess -Dateideskriptor -Tabelle ist ein Beispiel für a C-List.

Siehe auch

Verweise

  1. ^ Die offene Gruppe. "Die Open Group Basis Specials 7, IEEE STD 1003.1-2008, 2016 Ausgabe". Abgerufen 2017-09-21.
  2. ^ Die offene Gruppe. "Die Open Group Basis Specials 7, IEEE STD 1003.1-2008, 2016 Ausgabe". <Stdio.h>. Abgerufen 2017-09-21.
  3. ^ a b Bach, Maurice J. (1986). Das Design des UNIX -Betriebssystems (8 ed.). Prentice-Hall. pp.92–96. ISBN 9780132017992.
  4. ^ "Geräte - Was bedeutet die Ausgabe von 'll/proc/self/fd/' (aus 'll/dev/fd')?".
  5. ^ Die offene Gruppe. "Die offenen Gruppenbasis-Spezifikationen Ausgabe 7, IEEE STD 1003.1-2008, 2018 Ausgabe-Kreat". Abgerufen 2019-04-11.
  6. ^ Stephen Kitt, Michael Kerrisk. "Close_range (2) - Linux Manual Page". Abgerufen 2021-03-22.
  7. ^ Erweiterter API -Set, Teil 2. Die offene Gruppe. Oktober 2006. ISBN 1931624674.
  8. ^ Brinkmann, Marcus (2009-02-04). "Erstellen einer Brücke: Bibliotheks -APIs und Dateideskriptoren?". Cap-Talk. Archiviert von das Original Am 2012-07-30. Abgerufen 2017-09-21.
  9. ^ De Boyne Pollard, Jonathan (2007). "Setzen Sie die gemeinsam genutzten Dateideskriptoren nicht auf nicht blockierende E/A-Modus". Abgerufen 2017-09-21.