Provided by: manpages-de-dev_2.5-1_all bug

BEZEICHNUNG

       open, openat, creat - eine Datei öffnen und möglicherweise erzeugen

ÜBERSICHT

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

       int creat(const char *pathname, mode_t mode);

       int openat(int dirfd, const char *pathname, int flags);
       int openat(int dirfd, const char *pathname, int flags, mode_t mode);

   Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

       openat():
           Seit Glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Vor Glibc 2.10:
               _ATFILE_SOURCE

BESCHREIBUNG

       Der Systemaufruf open() öffnet eine durch pathname festgelegte Datei. Falls die angegebene
       Datei nicht existiert, kann sie optional (falls O_CREAT in flags festgelegt  wurde)  durch
       open() erstellt werden.

       Der Rückgabewert von open() ist ein Dateideskriptor, eine kleine, nicht negative Ganzzahl,
       die in nachfolgenden Systemaufrufen (read(2), write(2), lseek(2), fcntl(2)  usw.)  genutzt
       wird,  um  den Bezug zu der offenen Datei herzustellen. Der bei einem erfolgreichen Aufruf
       zurückgelieferte Dateideskriptor wird der niedrigstzahlige, noch  nicht  für  den  Prozess
       offene Dateideskriptor sein.

       Standardmäßig  bleibt  der  neue  Dateideskriptor  über  ein  execve(2) offen (d.h. der in
       fcntl(2) beschriebene Dateideskriptorschalter FD_CLOEXEC ist  anfangs  leer).  Der  weiter
       unten  beschriebene Schalter O_CLOEXEC kann zum Ändern dieser Vorgabe verwandt werden. Der
       Dateiversatz wird auf den Anfang der Datei gesetzt (siehe lseek(2)).

       Ein Aufruf von open() erstellt eine neue offene  Dateideskription,  einen  Entrag  in  der
       systemweiten  Tabelle  von  offenen  Dateien.  Die  offene  Dateideskription  zeichnet den
       Dateiversatz und die Dateizustandsschalter (siehe unten) auf. Ein Dateideskriptor ist eine
       Referenz  auf  eine  offene  Dateideskription.  Diese  Referenz ist nicht betroffen, falls
       pathname im Folgenden entfernt oder so verändert wird,  dass  er  auf  eine  andere  Datei
       zeigt. Für weitere Details über offene Dateideskriptionen, siehe ANMERKUNGEN.

       Das  Argument  flags  muss  einen der folgenden Zugriffsmodi enthalten: O_RDONLY, O_WRONLY
       oder O_RDWR. Diese erbitten, die Datei nur lesbar, nur schreibbar bzw. les-/schreibbar  zu
       öffnen.

       Zusätzlich  können  Null  oder  mehr Dateierstellungsschalter in flags mit einem bitweisen
       Oder  zusammengebracht  werden.  Die  Dateierstellungsschalter  sind  O_CLOEXEC,  O_CREAT,
       O_DIRECTORY,  O_EXCL,  O_NOCTTY,  O_NOFOLLOW,  O_TMPFILE und O_TRUNC. Die restlichen unten
       aufgeführten Schalter sind die Dateistatusschalter. Der Unterschied zwischen  diesen  zwei
       Gruppen  von  Schaltern  besteht darin, dass die Dateierstellungsschalter die Semantik der
       Open-Aktion  selbst  betreffen,  während  die   Dateistatusschalter   die   Semantik   der
       nachfolgenden  E/A-Aktionen  betreffen.  Die Dateistatussschalter können abgefragt und (in
       einigen Fällen) verändert werden; siehe fcntl(2) für Details.

       Die komplette Liste der Dateierstellungs- und Dateistatusschalter ist wie folgt:

       O_APPEND
              Die Datei wird im Anhängemodus geöffnet. Vor jedem write(2) wird  der  Dateiversatz
              an  das  Ende  der  Datei  positioniert,  wie  mit  lseek(2).  Die  Veränderung des
              Dateiversatzes  und  die  Schreibaktion  werden  als  einzelner,  atomarer  Schritt
              durchgeführt.

              O_APPEND  kann auf NFS-Dateisystemen zu beschädigten Dateien führen, falls mehr als
              ein Prozess auf einmal Daten an die Datei anhängt. Dies kommt  daher,  da  NFS  das
              Anhängen  an  Dateien nicht unterstützt und der Client-Kernel dies daher simulieren
              muss, was nicht ohne einen Wettlauf um Ressourcen passieren kann.

       O_ASYNC
              Aktiviert signalgetriebene E/A: erzeugt ein Signal (standardmäßig SIGIO, dies  kann
              aber   mit   fcntl(2)   geändert   werden),  wenn  Ein-  oder  Ausgabe  auf  diesem
              Dateideskriptor  möglich  wird.  Diese  Funktionalität  ist  nur   für   Terminals,
              Pseudoterminals,  Sockets  und  (seit  Linux  2.6) Pipes und FIFOs verfügbar. Siehe
              fcntl(2) für weitere Details. Siehe auch FEHLER unten.

       O_CLOEXEC (seit Linux 2.6.23)
              Aktiviert  den  Schalter  »close-on-exec«  für  den  neuen  Dateideskriptor.  Durch
              Festlegung   dieses   Schalters   wird   einem   Programm  ermöglicht,  zusätzliche
              fcntl(2)-F_SETFD-Aktionen, um den Schalter FD_CLOEXEC zu setzen, zu vermeiden.

              Beachten   Sie,   dass    die    Verwendung    dieses    Schalters    in    einigen
              Multithread-Programmen   notwendig   ist,   da   die   Verwendung  einer  separaten
              fcntl(2)-F_SETFD-Aktion, um den Schalter FD_CLOEXEC zu setzen, nicht ausreicht,  um
              eine  Race-Condition  zu vermeiden, bei der ein Thread einen Dateideskriptor öffnet
              und versucht, dessen close-on-exec-Schalter mittels fcntl(2) zur gleichen  Zeit  zu
              setzen,  zu  der  ein  anderer  Thread  einen fork(2) kombiniert mit eine execve(2)
              durchführt. Abhängig von der Reihenfolge der Ausführung kann der Ressourcenwettlauf
              dazu  führen,  dass  der von open(2) zurückgelieferte Dateideskriptor ungeplant von
              dem Programm durchgesickert ist, das von dem Kindprozess  mittels  fork(2)  erzeugt
              wurde.  (Diese  Art  von  Ressourcenwettlauf ist prinzipiell für jeden Systemaufruf
              möglich, der einen Dateideskriptor erstellt, dessen Schalter close-on-exec  gesetzt
              sein  solte,  und verschiedene andere Linux-Systemaufrufe stellen ein Äquivalent zu
              dem Schalter O_CLOEXEC bereit, um mit diesem Problem umzugehen.

       O_CREAT
              Falls pathname nicht existiert, wird eine normale Datei erstellt.

              Der Eigentümer (Benutzer-ID) der neuen Datei wird auf die effektive Benutzer-ID des
              Prozesses gesetzt.

              Die  Gruppen-Eigentümerschaft  (Gruppen-ID)  der  neuen Datei wird entweder auf die
              effektive Gruppen-ID des Prozesses (System-V-Semantik) oder auf die Gruppen-ID  des
              Elternverzeichnisses  (BSD-Semantik) gesetzt. Unter Linux hängt das Verhalten davon
              ab, ob das Modusbit set-group-ID auf dem Elternverzeichnis gesetzt ist.  Falls  das
              Bit gesetzt ist, gilt die BSD-Semantik, andernfalls gilt die System-V-Semantik. Bei
              einigen Dateisystemen  hängt  das  Verhalten  von  den  in  mount(8)  beschriebenen
              Einhängeoptionen bsdgroups und sysvgroups ab.

              Das  Argument  mode legt die Dateimodusbits, die beim Erstellen einer neuen Dateien
              angewandt werden sollen,  fest.  Das  Argument  muss  bereitgestellt  werden,  wenn
              O_CREAT oder O_TMPFILE in flags festgelegt wird. Falls weder O_CREAT noch O_TMPFILE
              festgelegt ist, wird mode ignoriert. Der effektive Modus wird durch die  umask  des
              Prozesses wie üblich verändert: in der Abwesenheit einer Standard-ACL ist der Modus
              der erstellten Datei (mode & ~umask). Beachten  Sie,  dass  dieser  Modus  nur  bei
              zukünftigen Zugriffen auf die neu erstellte Datei gilt; der Aufruf open(), der eine
              nur-lesbare  Datei  erstellte,  kann  sehr  wohl  einen  lese-   und   schreibbaren
              Dateideskriptor zurückliefern.

              Für mode werden die folgenden symbolischen Konstanten bereitgestellt:

              S_IRWXU  00700 Benutzer (Dateieigentümer) hat Lese-, Schreibe- und Ausführrechte

              S_IRUSR  00400 Benutzer hat Leserechte

              S_IWUSR  00200 Benutzer hat Schreibrechte

              S_IXUSR  00100 Benutzer hat Ausführrechte

              S_IRWXG  00070 Gruppe hat Lese-, Schreib- und Ausführrechte

              S_IRGRP  00040 Gruppe hat Leserechte

              S_IWGRP  00020 Gruppe hat Schreibrechte

              S_IXGRP  00010 Gruppe hat Ausführrechte

              S_IRWXO  00070 andere haben Lese-, Schreib- und Ausführrechte

              S_IROTH  00004 andere haben Leserechte

              S_IWOTH  00002 andere haben Schreibrechte

              S_IXOTH  00001 andere haben Ausführrechte

              Laut  POSIX  ist  der  Effekt,  wenn  andere  Bits  in  mode  gesetzt werden, nicht
              spezifiziert. Unter Linux werden auch die folgenden Bits in mode berücksichtigt:

              S_ISUID  0004000 set-user-ID-Bit

              S_ISGID  0002000 set-group-ID-Bit (siehe inode(7))

              S_ISVTX  0001000 Sticky-Bit (siehe inode(7))

       O_DIRECT (seit Linux 2.4.10)
              versucht die Zwischenspeichereffekte auf  die  E/A  in  und  aus  dieser  Datei  zu
              minimieren.   Im  Allgemeinen  reduziert  das  die  Leistung,  aber  in  besonderen
              Situationen  ist  das  nützlich,  beispielsweise  wenn  Anwendungen   ihre   eigene
              Zwischenspeicherung  vornehmen.  Datei-E/A  erfolgt  direkt  aus  den  Puffern  des
              Benutzerraums. Der Schalter O_DIRECT versucht, Daten synchron zu  übertragen,  gibt
              aber  nicht die Garantien des Schalters O_SYNC, dass Daten und notwendige Metadaten
              übetragen wurden. Um synchrone  E/A  zu  garantieren,  muss  O_SYNC  zusätzlich  zu
              O_DIRECT verwandt werden. Siehe ANMERKUNGEN für weitere Betrachtungen.

              Eine  semantisch  ähnliche (aber misbilligte) Schnittstelle für Blockgeräte wird in
              raw(8) beschrieben.

       O_DIRECTORY
              Falls pathname kein Verzeichnis ist, schlägt damit open fehl. Dieser Schalter wurde
              in   Kernel-Version   2.1.126   hinzugefügt,   um  Diensteverweigerungsangriffe  zu
              vermeiden, falls opendir(3) mit einem FIFO oder Bandgerät aufgerufen wird.

       O_DSYNC
              Schreibaktionen  auf  der  Datei  werden   entsprechend   den   Anforderungen   der
              synchronisierten E/A-Daten-Integritätsvervollständigung vervollständigt.

              Zum  Zeitpunkt  der Rückkehr von write(2) (und ähnlichen) sind die Ausgabedaten zur
              darunterliegenden Hardware übertragen worden, zusammen  mit  allen  Dateimetadaten,
              die  zum  Abfragen der Daten benötigt würden (d.h. als ob jedem write(2) ein Aufruf
              von fdatasync(2) gefolgt wäre). Siehe Hinweise unten.

       O_EXCL stellt sicher, dass  dieser  Aufruf  die  Datei  erstellt.  Falls  dieser  Schalter
              zusammen  mit  O_CREAT festgelegt wird und pathname bereits existiert, dann schlägt
              open() mit dem Fehler EEXIST fehl.

              Wenn diese zwei Schalter festgelegt werden, wird symbolischen Links nicht  gefolgt.
              Falls  pathname  ein  symbolischer  Link  ist, dann schlägt open() fehl, unabhängig
              davon, wohin der symbolische Link verweist.

              Im Allgemeinen ist das Verhalten von O_EXCL  undefiniert,  falls  es  ohne  O_CREAT
              verwandt  wird.  Es  gibt eine Ausnahme: Unter Linux 2.6 und neuer kann O_EXCL ohne
              O_CREAT verwandt werden, falls sich pathname auf ein Blockgerät bezieht. Falls  das
              Blockgerät vom System verwandt (d.h. eingehängt) ist, schlägt open() mit dem Fehler
              EBUSY fehl.

              Unter NFS wird O_EXCL nur beim Einsatz von NFSv3 oder neuer unter Kernel  2.6  oder
              neuer  unterstützt.  In  NFS-Umgebungen,  in  denen  keine Unterstützung für O_EXCL
              bereit steht, werden Programme, die sich  für  Sperrungen  darauf  verlassen,  eine
              Race-Condition  enthalten.  Portable  Programme,  die atomares Dateisperren mittels
              einer Sperrdatei durchführen wollen, und eine Abhängigkeit  auf  die  Unterstützung
              von O_EXCL duch NFS vermeiden müssen, können eine eindeutige Datei auf dem gleichen
              Dateisystem erstellen (d.h. den Rechnernamen und  die  PID  einbauen)  und  link(2)
              verwenden,  um einen Link auf die Sperrdatei zu erstellen. Falls link(2) den Wert 0
              zurückliefert, war die Sperrung erfolgreich. Andernfalls verwenden Sie stat(2)  auf
              einer  eindeutigen  Datei,  um zu prüfen, ob die Link-Anzahl sich auf 2 erhöht hat.
              Falls das der Fall ist, war die Sperre auch erfolgreich.

       O_LARGEFILE
              (LFS)  Erlaubt Dateien, deren Größe nicht in einem off_t (aber  in  einem  off64_t)
              dargestellt  werden  kann,  geöffnet  zu werden. Das Makro _LARGEFILE64_SOURCE muss
              (vor dem Einbinden aller Header-Dateien) definiert sein,  um  diese  Definition  zu
              erhalten.  Das  Setzen  des Feature-Test-Makros _FILE_OFFSET_BITS auf 64 (statt der
              Verwendung von O_LARGEFILE) ist  die  bevorzugte  Methode  zum  Zugriff  auf  große
              Dateien auf 32-Bit-Systemen (siehe feature_test_macros(7)).

       O_NOATIME (seit Linux 2.6.8)
              Aktualisiert  die letzte Zugriffszeit der Datei (st_atime in dem Inode) nicht, wenn
              ein read(2) auf der Datei erfolgt.

              Dieser Schalter kann nur verwandt werden,  falls  eine  der  folgenden  Bedingungen
              zutrifft:

              *  Die effektive UID des Prozesses passt auf die Eigentümer-UID des Datei.

              *  Der  aufrufende  Prozess  verfügt  über  die  Capability  CAP_FOWNER  in  seinem
                 Benutzernamensraum und es gibt eine Abbildung der Benutzer-UID der Datei in  den
                 Namensraum.

              Dieser  Schalter  ist  für  Indizierungs-  und  Backup-Programme gedacht, bei denen
              dessen Verwendung die Plattenaktivität signifikant reduzieren kann. Dieser Schalter
              funktioniert möglicherweise nicht auf allen Dateisystemen. Beispielsweise verwaltet
              bei NFS der Server die Zugriffszeit.

       O_NOCTTY
              Falls sich pathname auf ein Terminalgerät – siehe tty(4) – bezieht, wird  es  nicht
              das  steuernde  Terminal des Prozesses werden, selbst falls der Prozess noch keines
              hat.

       O_NOFOLLOW
              Falls pathname ein symbolischer Link ist, schlägt das Öffnen mit dem  Fehler  ELOOP
              fehl.  Symbolische  Links  in  früheren Komponenten des Pfadnamens werden weiterhin
              aufgelöst.  (Beachten  Sie,  dass  der  in  diesem  Fall   möglich   Fehler   ELOOP
              ununterscheidbar  vom  dem  Fall ist, in dem ein Öffnen fehlschlägt, da es zu viele
              symbolische Links beim Auflösen von  Komponenten  im  Präfixanteil  des  Pfadnamens
              gibt.)

              Dieser  Schalter  ist  eine  FreeBSD-Erweiterung,  die  in Version 2.1.126 in Linux
              hinzugefügt und schließlich in POSIX.1-2008 standardisiert wurde.

              Siehe auch O_PATH weiter unten.

       O_NONBLOCK oder O_NDELAY
              Falls möglich, wird die Datei  im  nichtblockierenden  Modus  geöffnet.  Weder  das
              open()  noch  folgende Aktionen auf dem zurückgegebenen Dateideskriptor werden dazu
              führen, dass der aufrufende Prozess warten muss.

              Beachten Sie, dass dieser Schalter für  reguläre  Dateien  und  Blockgeräte  keinen
              Effekt  hat.  Dies  bedeutet,  E/A-Aktionen  werden  (kurz)  blockieren,  wenn eine
              Geräteaktivität benötigt wird, unabhängig davon, ob O_NONBLOCK gesetzt ist. Da  die
              Semantik  von  O_NONBLOCK  irgendwann  einmal  implementiert werden könnte, sollten
              Anwendungen  nicht  vom  blockierenden  Verhalten   bei   regulären   Dateien   und
              Blockgeräten bei der Angabe dieses Schalters abhängen.

              Für  die  Handhabung  von  FIFOs  (benannten  Pipes),  siehe auch fifo(7). Für eine
              Diskussion des Effekts von O_NONBLOCK im Zusammenhang mit  verpflichtenden  Sperren
              und mit Datei-Ausleihen, siehe fcntl(2).

       O_PATH (seit Linux 2.6.39)
              Erhält  einen  Dateideskriptor,  der für zwei Zwecke eingesetzt werden kann: um den
              Ort im Dateisystembaum anzuzeigen und um Aktionen durchzuführen, die rein  auf  der
              Dateideskriptorebene  agieren.  Die  Datei  selbst  wird  nicht geöffnet und andere
              Dateiaktionen  (z.B.  read(2),  write(2),   fchmod(2),   fchown(2),   fgetxattr(2),
              ioctl(2), mmap(2)) schlagen mit dem Fehler EBADF fehl.

              Die  folgenden  Aktionen  können  mit dem entstandenen Dateideskriptor durchgeführt
              werden:

              *  close(2).

              *  fchdir(2), falls der Dateideskriptor auf ein Verzeichnis  verweist  (seit  Linux
                 3.5).

              *  fstat(2)  (seit Linux 3.6).

              *  fstatfs(2)  (seit Linux 3.12).

              *  Duplizieren des Dateideskriptors (dup(2), fcntl(2)  F_DUPFD, usw.).

              *  Ermitteln  und  Setzen  von  Dateideskriptorenschaltern  (fcntl(2)  F_GETFD  und
                 F_SETFD).

              *  Ermitteln von  offenen  Dateistatusschaltern  mittels  der  Aktion  F_GETFL  von
                 fcntl(2): Die zurückgelieferten Schalter werden das Bit O_PATH enthalten.

              *  Übergabe  des  Dateideskriptors  als Argument dirfd von openat() und den anderen
                 »*at()«-Systemaufrufen. Dazu gehört linkat(2) mit  AT_EMPTY_PATH  (oder  mittels
                 AT_SYMLINK_FOLLOW von Procfs), selbst falls die Datei kein Verzeichnis ist.

              *  Übergabe    des    Dateideskriptors    an    einen   anderen   Prozess   mittels
                 UNIX-Domain-Sockets (siehe SCM_RIGHTS in unix(7)).

              Wenn O_PATH in flags angegeben ist,  werden  die  von  O_CLOEXEC,  O_DIRECTORY  und
              O_NOFOLLOW verschiedenen Schalter-Bits ignoriert.

              Öffnen einer Datei oder eines Verzeichnisses mit dem Schalter O_PATH benötigt keine
              Rechte  an  dem  Objekt  selber  (allerdings  benötigt  es  Ausführrechte  auf  den
              Verzeichnissen  im  Pfadpräfix).  Abhängig  von  nachfolgenden  Aktionen  kann eine
              Überprüfung auf geeignete Dateiberechtigungen durchgeführt  werden  (z.B.  benötigt
              fchdir(2)  Ausführrechte  auf  das durch sein Dateideskriptorargument referenzierte
              Verzeichnis). Im Gegensatz dazu  benötigt  das  Erlangen  einer  Referenz  auf  ein
              Dateisystemobjekt  durch  Öffen  mit  dem  Schalter  O_RDONLY,  dass der Aufrufende
              Leseberechtigungen  am  Objekt  hat,  selbst  wenn  nachfolgende   Aktionen   (z.B.
              fchdir(2), fstat(2)) keine Leseberechtigungen am Objekt benötigen.

              Falls pathname ein symbolischer Link ist und auch der Schalter O_NOFOLLOW angegeben
              ist, dann liefert der  Aufruf  einen  Dateideskriptor  zurück,  der  sich  auf  den
              symbolischen  Link  bezieht.  Dieser  Dateideskriptor  kann  als  Argument dirfd in
              Aufrufen von fchownat(2), fstatat(2), linkat(2) und readlinkat(2) mit einem  leeren
              Dateinamen verwandt werden, um Aufrufe auf den symbolischen Link anzuwenden.

              If  pathname  refers  to  an automount point that has not yet been triggered, so no
              other filesystem is mounted  on  it,  then  the  call  returns  a  file  descriptor
              referring  to  the  automount directory without triggering a mount. fstatfs(2)  can
              then be used to determine if  it  is,  in  fact,  an  untriggered  automount  point
              (.f_type == AUTOFS_SUPER_MAGIC).

              Eine Einsatz von O_PATH für reguläre Dateien ist die Bereitstellung des Äquivalents
              der Funktionalität O_EXEC von POSIX.1. Dies erlaubt es, eine Datei  zu  öffen,  für
              die  Ausführ-  aber  keine  Leserechte  vorliegen,  und  dann  diese  Datei mittels
              Schritten der folgenden Art auszuführen:

                  char buf[PATH_MAX];
                  fd = open("ein_Programm", O_PATH);
                  snprintf(buf, "/proc/self/fd/%d", fd);
                  execl(buf, "ein_Programm", (char *) NULL);

              Ein O_PATH-Dateideskriptor kann auch an das Argument von  fexecve(3)  weitergegeben
              werden.

       O_SYNC Schreibaktionen   auf  dieser  Datei  werden  entsprechend  den  Anforderungen  der
              synchronisierten   E/A-Datei-Integritätsvervollständigung    vervollständigt    (in
              Kontrast     zu     der    durch    O_DSYNC    bereitgestellten    synchronisierten
              E/A-Datei-Integritätsvervollständigung).

              Zum Zeitpunkt, zu dem write(2) (und ähnliche) zurückkehrt, wurden die  Ausgabedaten
              und  zugehörigen  Dateimetadaten bereits an die darunterliegende Hardware übergeben
              (d.h. als ob jeder write(2) von einem Aufruf von  fsync(2)  gefolgt  worden  wäre.)
              Siehe ANMERKUNGEN unten.

       O_TMPFILE (seit Linux 3.11)
              Erstellt  eine  unbenannte  temporäre normale Datei. Das Argument pathname legt ein
              Verzeichnis  fest;  ein  unbenannter  Inode  wird   in   dem   Dateisystem   dieses
              Verzeichnisses erstellt. Alles, was in die entstandene Datei geschrieben wird, geht
              verloren, wenn der letzte Dateideskriptor geschlossen wird, sofern der Datei  nicht
              ein Name gegeben wurde.

              O_TMPFILE  muss  als  eines aus O_RDWR oder O_WRONLY und optional O_EXCL festgelegt
              werden. Falls O_EXCL nicht festgelegt  wird,  dann  kann  linkat(2)  dazu  verwandt
              werden,  die  temporäre  Datei  in das Dateisystem zu linken, womit diese permanent
              wird, unter Verwendung von Code wie dem folgenden:

                  char path[PATH_MAX];
                  fd = open("/Pfad/zu/Verz", O_TMPFILE | O_RDWR,
                                          S_IRUSR | S_IWUSR);

                  /* Datei-E/A auf »fd«… */

                  snprintf(path, PATH_MAX,  "/proc/self/fd/%d", fd);
                  linkat(AT_FDCWD, path, AT_FDCWD, "/Pfad/zur/Datei",
                                          AT_SYMLINK_FOLLOW);

              In diesem Fall bestimmt das Argument mode von open() den Dateirechtemodus, wie  bei
              O_CREAT.

              Wird  O_EXCL  in  Zusammenhang mit O_TMPFILE festgelegt, dann wird verhindert, dass
              die Datei in  das  Dateisystem  in  der  oben  beschriebenen  Weise  gelinkt  wird.
              (Beachten Sie, dass die Bedeutung von O_EXCL in diesem Fall anders als sonst ist.)

              Es gibt zwei Haupteinsatzgebiete für O_TMPFILE:

              *  Verbesserte    Funktionalität    von   tmpfile(3):   Ressourcen-Wettstreit-freie
                 Erstellung temporärer Dateien die (1)  automatisch  gelöscht  werden,  wenn  sie
                 geschlossen  werden;  die  (2) niemals mittels irgend eines Dateinamens erreicht
                 werden können; die (3) nicht Subjekt eines Symlink-Angriffs  sind  und  die  (4)
                 nicht vom Aufrufenden verlangen, sich eindeutige Namen auszudenken.

              *  Erstellen  einer  Datei, die ursprünglich unsichtbar ist, die dann mit den Daten
                 gefüllt und angepasst wird, um die korrekten  Dateisystemattribute  zu  erhalten
                 ((fchown(2),  fchmod(2), fsetxattr(2) usw.), bevor sie atomar in das Dateisystem
                 in  einer  vollständigen  Form  gelinkt  wird  (mittels   linkat(2)   wie   oben
                 beschrieben).

              O_TMPFILE  benötigt  die Unterstützung des zugrundeliegenden Dateisystems. Nur eine
              Teilmenge  der   Linux-Dateisysteme   unterstützt   dies.   In   der   anfänglichen
              Implementierung wurde die Unterstützung für die Dateisysteme Ext2, Ext3, Ext4, UDF,
              Minix und Shmem bereitgestellt. Die Unterstützung für  weitere  Dateisysteme  wurde
              später  wie  folgt  hinzugefügt:  XFS (Linux 3.15), Btrfs (Linux 3.16), F2FS (Linux
              3.16) und Ubifs (Linux 4.9).

       O_TRUNC
              Falls die Datei bereits existiert, eine reguläre Datei ist  und  der  Zugriffsmodus
              Schreiben  erlaubt  (d.h.  O_RDWR oder O_WRONLY ist), dann wird sie auf die Länge 0
              abgeschnitten. Falls die Datei ein FIFO  oder  Terminalgerät  ist,  dann  wird  der
              Schalter  O_TRUNC  ignoriert.  Andernfalls  ist  die  Auswirkung  von O_TRUNC nicht
              festgelegt.

   creat()
       Ein Aufruf von creat() is  äquivalent  zum  Aufruf  von  open()  mit  flags  identisch  zu
       O_CREAT|O_WRONLY|O_TRUNC.

   openat()
       Der  Systemaufruf  openat()  arbeitet  genau  wie  open(),  außer  den  hier beschriebenen
       Unterschieden.

       Falls der in pathname angegebene Pfadname  relativ  ist,  dann  wird  er  relativ  zu  dem
       Verzeichnis  interpretiert,  auf  das der Dateideskriptor dirfd verweist (statt relativ zu
       dem aktuellen Arbeitsverzeichnis des aufrufenden Prozesses, wie es bei  open()  für  einen
       relativen Pfadnamen erfolgt).

       Falls  pathname  relativ  ist  und  dirfd  den speziellen Wert AT_FDCWD enthält, dann wird
       pathname relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses  interpretiert
       (wie open()).

       Falls pathname absolut ist wird dirfd ignoriert.

RÜCKGABEWERT

       open(),  openat()  und creat() liefern den neuen Dateideskriptor zurück oder -1, falls ein
       Fehler auftrat (in diesem Fall wird errno entsprechend gesetzt).

FEHLER

       open(), openat() und creat() können mit den folgenden Fehlern fehlschlagen:

       EACCES Der angeforderte Zugriff auf die Datei ist nicht erlaubt oder die  Suchberechtigung
              ist  für  eines  der  Verzeichnisse  im Pfadanteil von pathname verweigert oder die
              Datei existierte noch nicht oder Schreibzugriff auf das Elternverzeichnis ist nicht
              erlaubt. (Siehe auch path_resolution(7).)

       EDQUOT Wo  O_CREAT  angegeben ist existiert die Datei nicht und die Quota des Benutzers an
              Plattenblöcken oder Inodes auf dem Dateisystem ist erschöpft.

       EEXIST pathname existiert bereits und O_CREAT und O_EXCL wurden verwandt.

       EFAULT pathname zeigt aus dem für Sie zugänglichen Adressraum heraus.

       EFBIG  siehe EOVERFLOW

       EINTR  Während der Aufruf wartet, bis ein langsames Gerät vollständig geöffnet  ist  (z.B.
              ein  FIFO,  siehe  fifo(7)),  wurde er von einem Signal-Handler unterbrochen, siehe
              signal(7).

       EINVAL Das Dateisystem unterstützt den Schalter O_DIRECT nicht. Lesen Sie ANMERKUNGEN  für
              weitere Informationen.

       EINVAL Unzulässiger Wert in flags.

       EINVAL O_TMPFILE  wurde  in  flags  angegeben,  aber  weder  O_WRONLY  noch  O_RDWR wurden
              angegeben.

       EINVAL O_CREAT wurde in flags angegeben und die abschließende Komponente (»basename«)  des
              pathname  der  neuen  Datei  ist  ungültig  (d.h.  sie  enthält  im  unterliegenden
              Dateisystem nicht erlaubte Zeichen).

       EISDIR pathname bezieht sich auf ein Verzeichnis und  der  Zugriff  beinhaltete  Schreiben
              (d.h. O_WRONLY oder O_RDWR ist gesetzt).

       EISDIR pathname  bezieht  sich  auf  ein existierendes Verzeichnis, O_TMPFILE und entweder
              O_WRONLY oder O_RDWR wurde in flags angegeben, aber diese Kernelversion stellt  die
              Funktionalität O_TMPFILE nicht zur Verfügung.

       ELOOP  Bei der Auflösung von pathname wurden zu viele symbolische Links gefunden.

       ELOOP  pathname  war  ein  symbolischer  Link und flags legte O_NOFOLLOW aber nicht O_PATH
              fest.

       EMFILE Die pro-Prozess-Begrenzung der  Anzahl  offener  Dateideskriptoren  wurde  erreicht
              (siehe die Beschreibung von RLIMIT_NOFILE in getrlimit(2)).

       ENAMETOOLONG
              pathname war zu lang.

       ENFILE Die systemweite Beschränkung für die Gesamtzahl offener Dateien wurde erreicht.

       ENODEV pathname  bezieht  sich  auf eine Geräte-Spezialdatei und kein entsprechendes Gerät
              existiert. (Dies ist ein Fehler im Linux-Kernel; in  dieser  Situation  muss  ENXIO
              zurückgeliefert werden.)

       ENOENT O_CREAT  ist  nicht  gesetzt  und  die  benannte  Datei  existiert  nicht. Oder ein
              Verzeichnisteil in pathname existiert nicht oder ist ein toter symbolischer Link.

       ENOENT pathname bezieht sich  auf  ein  nicht  existierendes  Verzeichnis,  O_TMPFILE  und
              entweder  O_WRONLY  oder  O_RDWR wurde in flags angegeben, aber diese Kernelversion
              stellt die Funktionalität O_TMPFILE nicht zur Verfügung.

       ENOMEM Die benannte Datei ist ein FIFO, aber der Speicher für den FIFO-Puffer  kann  nicht
              bereitgestellt   werden,   da   die   benutzerbezogene   harte   Grenze   bezüglich
              Speicherzuweisung für Pipes erreicht wurde und  der  Aufrufende  keine  Privilegien
              hat; siehe pipe(7).

       ENOMEM Es war nicht genügend Kernelspeicher verfügbar.

       ENOSPC pathname  sollte erstellt werden, aber das Gerät, das pathname enthält, hat für die
              neue Datei keinen Platz.

       ENOTDIR
              Eine  als  Verzeichnis  verwandte  Komponente  in  pathname  ist  tatsächlich  kein
              Verzeichnis oder O_DIRECTORY wurde angegeben, aber pathname war kein Verzeichnis.

       ENXIO  O_NONBLOCK | O_WRONLY ist gesetzt, die benannte Datei ist ein FIFO und kein Prozess
              hat den FIFO zum Lesen offen.

       ENXIO  Die Datei ist eine Geräte-Spezialdatei und kein entsprechendes Gerät existiert.

       EOPNOTSUPP
              Das Dateisystem, das pathname enthält, unterstützt O_TMPFILE nicht.

       EOVERFLOW
              pathname bezieht sich auf eine normale Datei, die  zu  groß  zum  Öffnen  ist.  Das
              normale    Szenario    ist,    dass    eine   auf   einer   32-Bit-Plattform   ohne
              -D_FILE_OFFSET_BITS=64 übersetzte Anwendung versuchte, eine Datei zu öffnen,  deren
              Größe  (1<<31)-1 byte überschritt; siehe auch O_LARGEFILE weiter oben. Dies ist der
              durch POSIX.1 festgelegte Fehler; in Kerneln vor 2.6.24 gab Linux  in  diesem  Fall
              den Fehler EFBIG zurück.

       EPERM  Der   Schalter  O_NOATIME  war  festgelegt,  aber  die  effektive  Benutzer-ID  des
              Aufrufenden passte nicht auf den Eigentümer der Datei und der Aufrufende war  nicht
              privilegiert.

       EPERM  Die Aktion wurde durch eine Dateiversiegelung verhindert; siehe fcntl(2).

       EROFS  pathname  bezieht sich auf eine Datei auf einem schreibgeschützten Dateisystem, und
              Schreibzugriff wurde angefordert.

       ETXTBSY
              pathname bezieht sich auf ein ausführbares Abbild, das derzeit ausgeführt wird  und
              Schreibzugriff wurde erbeten.

       EWOULDBLOCK
              Der  Schalter  O_NONBLOCK  wurde angegeben und eine inkompatible Ausleihe wurde auf
              der Datei gehalten (siehe fcntl(2)).

       Die folgenden zusätzlichen Fehler können bei openat() auftreten:

       EBADF  dirfd ist kein zulässiger Dateideskriptor.

       ENOTDIR
              pathname ist ein relativer Pfadname und dirfd ist ein Dateideskriptor, der sich auf
              eine Datei statt auf ein Verzeichnis bezieht.

VERSIONEN

       openat()  wurde  zu  Linux in Kernel 2.6.16 hinzugefügt; Bibliotheksunterstützung wurde zu
       Glibc in Version 2.4 hinzugefügt.

KONFORM ZU

       open(), creat()  SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

       openat(): POSIX.1-2008.

       Die Schalter O_DIRECT, O_NOATIME, O_PATH und O_TMPFILE sind Linux-spezifisch.  Sie  müssen
       _GNU_SOURCE definieren, um ihre Definitionen zu erhalten.

       Die  Schalter  O_CLOEXEC, O_DIRECTORY und O_NOFOLLOW sind nicht in POSIX.1-2001 sondern in
       POSIX.1-2008 spezifiziert. Seit Glibc 2.12 kann ihre  Definition  erhalten  werden,  indem
       entweder  _POSIX_C_SOURCE  mit  einem  Wert größer als oder identisch zu 200809L definiert
       wird oder durch _XOPEN_SOURCE mit einem Wert größer als oder identisch zu  700.  In  Glibc
       2.11 und älter kann die Definition über die Definition von _GNU_SOURCE erhalten werden.

       Wie  in  feature_test_macros(7) angemerkt, müssen Feature-Test-Makros wie _POSIX_C_SOURCE,
       _XOPEN_SOURCE  und  _GNU_SOURCE  definiert  werden,  bevor  irgendeine  Header-Datei   mit
       »include« verwandt wird.

ANMERKUNGEN

       Unter  Linux  gibt  der  Schalter O_NONBLOCK an, dass die Datei geöffnet werden soll, ohne
       aber notwendigerweise zu lesen oder zu schreiben. Dies wird typischerweise zum Öffnen  von
       Geräten verwandt, um den Dateideskriptor für ioctl(2) zu erhalten.

       Der   (undefinierte)   Effekt   von  O_RDONLY  |  O_TRUNC  unterscheidet  sich  in  vielen
       Implementierungen. Auf vielen Systemen wird die Datei tatsächlich abgeschnitten.

       Beachten Sie, dass open()  Spezial-Gerätedateien  öffnen  kann,  aber  creat()  sie  nicht
       erstellen kann. Verwenden Sie stattdessen mknod(2).

       Falls  die Datei neu erstellt wurde, werden ihre Felder st_atime, st_ctime, st_mtime (Zeit
       des letzten Zugriffs, Zeit der letzten Statusänderung und Zeit der letzten Änderung, siehe
       stat(2))  auf  die  aktuelle  Zeit gesetzt und ebenso die Felder st_ctime und st_mtime des
       Elternverzeichnisses. Andernfalls, falls die Datei aufgrund des Schalters O_TRUNC geändert
       wurde, werden ihre Felder st_ctime und st_mtime auf die aktuelle Zeit gesetzt.

       Die  Dateien  im  Verzeichnis  /proc/[PID]/fd  zeigen  die  offenen  Dateideskriptoren des
       Prozesses mit der PID PID. Die Dateien im Verzeichnis /proc/[PID]/fdinfo zeigen noch  mehr
       Informationen  über  diese Dateideskriptoren. Siehe proc(5) für weitere Details über beide
       Verzeichnisse.

   Offene Dateideskriptionen:
       Der Begriff offene Dateideskription wird von POSIX verwandt, um sich auf Einträge  in  der
       systemweiten  Tabelle  der  offenen  Dateien  zu  beziehen. In anderen Zusammenhängen wird
       dieses  Objekt  verschieden   auch   »offenes   Dateiobjekt«,   »Datei-Handle«,   »offener
       Dateitabelleneintrag« oder – in der Sprache der Kernel-Entwickler – struct file genannt.

       Wenn  ein  Dateideskriptor  (mit  dup(2) oder ähnlichem) dupliziert wird, bezieht sich das
       Duplikat auf die gleiche offene Dateideskription wie der ursprüngliche Datedeskriptor  und
       die  zwei  Dateideskriptoren  haben  konsequenterweise  den  gleichen Dateiversatz und die
       gleichen Dateistatusschalter. Solch ein gemeinsamer  Satz  kann  auch  zwischen  Prozessen
       auftreten:  ein  mit  fork(2)  erstellter Kindprozess erbt Duplikate der Dateideskriptoren
       seines Elternprozesses  und  diese  Duplikate  beziehen  sich  auf  die  gleichen  offenen
       Dateideskriptoren.

       Jedes open() einer Datei erstellt eine neue offene Dateideskription; daher kann es mehrere
       offene Dateideskriptionen geben, die einem Datei-Inode entsprechen.

       Unter  Linux  kann  die  Aktion  KCMP_FILE  von  kcmp(2)  zum   Testen,   ob   sich   zwei
       Dateideskriptoren  (in  dem gleichen Prozess oder in zwei verschiedenen Prozessen) auf die
       gleiche offene Dateideskription beziehen, verwandt werden.

   Synchronisierte E/A
       Die Option »synchronisierte E/A« von POSIX.1-2008 spezifiziert verschiedene Varianten  der
       synchronisierten  E/A und spezifiziert Schalter O_SYNC, O_DSYNC und O_RSYNC von open() für
       die Steuerung des Verhaltens. Unabhängig  davon,  ob  eine  Implementierung  diese  Option
       unterstützt   muss   sie  mindestens  die  Verwendung  von  O_SYNC  für  reguläre  Dateien
       unterstützen.

       Linux implementiert O_SYNC und O_DSYNC, aber nicht  O_RSYNC.  (Etwas  inkorrekt  definiert
       Glibc O_RSYNC auf den gleichen Wert wie O_SYNC.)

       O_SYNC stellt synchronisierte E/A-Datei-Integritätsvervollständigung bereit. Das bedeutet,
       Schreibaktionen schieben ihre Daten und  zugehörigen  Metadaten  an  die  darunterliegende
       Hardware.  O_DSYNC  stellt  synchronisierte E/A-Daten-Integritätsvervollständigung bereit.
       Das bedeutet, Schreibaktionen schieben ihre Daten an die darunterliegende  Hardware,  aber
       schieben  nur  Metadatenaktualisierungen,  die  benötigt  werden, um folgende Leseaktionen
       erfolgreich abzuschließen. Datenintegritätsvervollständigung kann die Anzahl der  Aktionen
       reduzieren,   die   für   Anwendungen  notwendig  werden,  die  keine  Garantien  für  die
       Dateiintegritätsvervollständigung benötigen.

       Um den Unterschied zwischen den zwei Arten von Vervollständigung zu  verstehen,  betrachen
       Sie  zwei verschiedene Dateimetadaten: den Zeitstempel der letzten Änderung (st_mtime) und
       die  Dateilänge.  Alle  Schreibaktionen  aktualisieren   den   Zeitstempel   der   letzten
       Dateiänderung,  aber  nur  Schreibaktionen, die Daten am Ende der Datei hinzufügen, müssen
       die Dateilänge ändern. Der Zeitstempel  der  letzten  Änderung  wird  nicht  benötigt,  um
       sicherzustellen,  dass  eine  Leseaktion  erfolgreich  abgeschlossen werden kann, aber die
       Dateilänge wird dafür benötigt. Daher würde O_DSYNC nur garantieren, dass Aktualisierungen
       der  Dateilängen-Metadaten  rausgeschoben  werden (während O_SYNC immer auch das Metadatum
       des Zeitstempels der letzten Änderung rausschieben würde).

       Vor Linux 2.6.33 implementierte Linux nur den  Schalter  O_SYNC  für  open().  Als  dieser
       Schalter  spezifiziert  wurde,  stellten  die  meisten  Dateisysteme  das  Äquivalent  von
       synchronisierter   E/A-Daten-Integritätsvervollständigung   bereit   (d.h.   O_SYNC    war
       tatsächlich als Äquivalent von O_DSYNC implementiert).

       Seit   Linux   2.6.33   wird   korrekte   Unterstützung   für  O_SYNC  bereitgestellt.  Um
       Rückwärtskompatibilität sicherzustellen wurde aber O_DSYNC mit dem gleichen Wert  wie  das
       historische  O_SYNC definiert und O_SYNC wurde als neuer (Zweibit-)Schalterwert definiert,
       der den Wert des Schalters O_DSYNC enthält. Das stellt sicher, dass Anwendungen, die gegen
       neue  Header  übersetzt wurden, mindestens die Semantik von O_DSYNC auf pre-2.6.33-Kerneln
       erhalten.

   Unterschiede C-Bibliothek/Kernel
       Seit Version 2.26 setzt die Glibc-Wrapper-Funktion für open()  den  Systemaufruf  openat()
       statt  des  Systemaufrufs  open() des Kernels ein. Für bestimmte Architekturen stimmt dies
       auch für Glibc-Versionen vor 2.26.

   NFS
       Es gibt mehrere Unglücklichkeiten im Protokoll, das  NFS  unterliegt,  die  unter  anderem
       O_SYNC und O_NDELAY betreffen.

       Auf  NFS-Dateisystemen  mit  aktivierter UID-Abbildung könnte open() einen Dateideskriptor
       zurückliefern, aber read(2)-Anfragen werden beispielsweise  mit  EACCES  verweigert.  Dies
       erfolgt,   da  der  Client  open()  durchführt,  indem  er  die  Rechte  prüft,  aber  die
       UID-Abbildung auf dem Server bei Lese- und Schreibanfragen erfolgt.

   FIFOs
       Öffnen des Lese- oder Schreibendes  eines  FIFOS  blockiert,  bis  das  andere  Ende  auch
       geöffnet  wurde  (durch  einen  anderen  Prozess  oder  Thread). Siehe fifo(7) für weitere
       Details.

   Dateizugriffsmodus
       Anders  als  andere  Werte,  die  in   flags   festgelegt   werden   können,   legen   die
       Zugriffsmodus-Werte   O_RDONLY,   O_WRONLY   und  O_RDWR  nicht  individuelle  Bits  fest.
       Stattdessen definieren sie die untersten zwei Bits von flags und sind respektive als 0,  1
       und 2 definiert. Mit anderen Worten, die Kombination O_RDONLY | O_WRONLY ist ein logischer
       Fehler und hat bestimmt nicht die gleiche Bedeutung wie O_RDWR.

       Linux reserviert den besonderen, nicht standardisierten  Zugriffsmodus  3  (binär  11)  in
       flags  für  folgendes: Prüfe auf Lese- und Schreibberechtigung der Datei und liefere einen
       Dateideskriptor zurück, der weder zum Lesen  noch  zum  Schreiben  verwandt  werden  kann.
       Dieser  nicht  standardisierte  Zugriffsmodus wird von einigen Linux-Treibern verwandt, um
       einen Dateideskriptor zurückzuliefern, der  nur  für  gerätespezifische  ioctl(2)-Aktionen
       benutzt werden kann.

   Begründung für openat()- und andere Verzeichnis-Dateideskriptor APIs
       openat()     und    andere    Systemaufrufe    und    Bibliotheksfunktionen,    die    ein
       Verzeichnis-Dateideskriptor als  Argument  akzeptieren  (d.h.  execveat(2),  faccessat(2),
       fanotify_mark(2),   fchmodat(2),   fchownat(2),   fstatat(2),   futimesat(2),   linkat(2),
       mkdirat(2),  mknodat(2),  name_to_handle_at(2),  readlinkat(2),   renameat(2),   statx(2),
       symlinkat(2),  unlinkat(2),  utimensat(2),  mkfifoat(3)  und  scandirat(3)) behandeln zwei
       Probleme mit der älteren Schnittstelle, die dieser voranging. Hier erfolgt die Erläuterung
       am openat()-Aufruf, aber der Grund ist analog für die anderen Schnittstellen.

       Erstens  erlaubt  openat()  es  Anwendungen,  Race-Conditions  zu  vermeiden,  die bei der
       Verwendung von open() auftreten können, wenn Dateien geöffnet werden, die  sich  nicht  im
       lokalen  Verzeichnis  befinden. Diese Race-Conditions entstammen der Tatsache, dass einige
       Komponenten des Verzeichnispräfixes, der an open() übergeben wird, parallel zum Aufruf von
       open()  geändert  werden  können.  Nehmen  Sie  beispielsweise  an,  dass  Sie  die  Datei
       dir1/dir2/xxx.dep öffnen möchten,  falls  dir1/dir2/xxx  existiert.  Das  Problem  besteht
       darin,  das sich zwischen der Existenzüberprüfung und dem Schritt der Dateierstellung dir1
       oder dir2 (die symbolischen Links sein können) geändert haben und auf  einen  anderen  Ort
       zeigen   können.   Solche   Ressourcenwettläufe   können   vermieden   werden,  indem  ein
       Dateideskriptor für das Zielverzeichnis geöffnet wird und dann dieser Dateideskriptor  als
       Argument  dirfd von (beispielsweise) fstatat(2) und openat() verwandt wird. Die Verwendung
       des Dateideskriptors dirfd hat auch weitere Vorteile:

       *  Der Dateideskriptor ist eine stabile Referenz zu  dem  Verzeichnis,  selbst  falls  das
          Verzeichnis umbenannt wird.

       *  Der offene Dateideskriptor verhindert, dass das darunterliegende Dateisystem ausgehängt
          wird,  genauso  als  wenn  ein  Prozess  sein  aktuelles  Arbeitsverzeichnis  auf   dem
          Dateisystem hat.

       Zweitens  erlaubt  openat()  die Implementierung eines pro-Thread-»Arbeitsverzeichnisses«,
       mittels von der Anwendung verwalteten  Datei-Deskriptor(en).  (Diese  Funktionalität  kann
       weniger effizient auch mittels Tricks basierend auf der Verwendung von /proc/self/fd/dirfd
       erreicht werden.)

   O_DIRECT
       Der Schalter O_DIRECT könnte Ausrichtungsbeschränkungen  in  der  Länge  und  Adresse  der
       Puffer  im  Benutzerbereich und dem Dateiversatz von E/As verhängen. Unter Linux variieren
       die Ausrichtungsbeschränkungen je nach Dateisystem und Kernelversion und können auch  ganz
       fehlen.  Es  gibt  jedoch  derzeit  keine  dateisystemunabhängige  Schnittstelle  für eine
       Anwendung,  um  diese  Beschränkungen  für  eine  gegebene  Datei  oder  ein   Dateisystem
       aufzufinden.  Einige  Dateisysteme  stellen  zu  diesem  Zweck ihre eigenen Schnittstellen
       bereit, beispielsweise die Aktion XFS_IOC_DIOINFO in xfsctl(3).

       Unter Linux 2.4 müssen Übertragungsgrößen, die Ausrichtung  des  Benutzerpuffers  und  der
       Dateiversatz  Vielfache  der  logischen Blockgröße des Dateisystems sein. Seit Linux 2.6.0
       reicht ein  Ausrichtung  an  der  logischen  Blockgröße  des  darunterliegenden  Speichers
       (normalerweise  512  byte)  aus. Die logische Blockgröße kann mit der Aktion BLKSSZGET von
       ioctl(2) festgelegt werden oder mittels des Shell-Befehls:

           blockdev --getss

       O_DIRECT I/Os should never be run concurrently with the fork(2) system call, if the memory
       buffer is a private mapping (i.e., any mapping created with the mmap(2)  MAP_PRIVATE flag;
       this includes memory allocated on the heap and statically  allocated  buffers).  Any  such
       I/Os,  whether  submitted  via an asynchronous I/O interface or from another thread in the
       process, should be completed before fork(2)  is called. Failure to do  so  can  result  in
       data  corruption  and  undefined  behavior in parent and child processes. This restriction
       does not apply when the memory buffer for the O_DIRECT I/Os was created using shmat(2)  or
       mmap(2)   with the MAP_SHARED flag. Nor does this restriction apply when the memory buffer
       has been advised as MADV_DONTFORK with madvise(2), ensuring that it will not be  available
       to the child after fork(2).

       Der  Schalter O_DIRECT wurde in SGI IRIX eingeführt, wo er Ausrichtungsbeschränkungen hat,
       die denen von Linux  2.4  ähnlich  sind.  IRIX  hat  außerdem  einen  fcntl(2)-Aufruf,  um
       geeignete  Ausrichtungen  und  Größen  abzufragen.  FreeBSD 4.x führte einen gleichnamigen
       Schalter ein, jedoch ohne Ausrichtungsbeschränkungen.

       Die Unterstützung für O_DIRECT wurde unter Linux in  Kernel  Version  2.4.10  hinzugefügt.
       Ältere  Kernel  werden diesen Schalter einfach ignorieren. Einige Dateisysteme könnten den
       Schalter nicht implementieren. In diesem Fall schlägt open() mit dem Fehler  EINVAL  fehl,
       falls er verwandt wird.

       Anwendungen  sollten  das  Vermischen von O_DIRECT und normaler E/A auf der gleichen Datei
       vermeiden, insbesondere für überlappende Regionen in der gleichen Datei. Selbst  wenn  das
       Dateisystem   die   Kohärenzprobleme   in  dieser  Situation  korrekt  handhabt,  ist  der
       Gesamt-E/A-Durchsatz wahrscheinlich geringer,  als  wenn  einer  der  beiden  Modi  allein
       verwandt worden wäre. Entsprechend sollten Anwendungen das Mischen von mmap(2) von Dateien
       mit direktem E/A auf die gleichen Dateien vermeiden.

       Das Verhalten von O_DIRECT mit NFS wird sich vom lokalen Dateisystem unterscheiden. Ältere
       Kernel  oder  Kernel,  die  in  bestimmter  Weise  konfiguriert wurden, unterstützen diese
       Kombination möglicherweise nicht. Das NFS-Protokoll unterstützt die Übergabe des Schalters
       an  den  Server  nicht,  daher wird O_DIRECT-E/A den Seitenzwischenspeicher auf dem Client
       umgehen. Der Server könnte weiterhin die E/A  zwischenspeichern.  Der  Client  bittet  den
       Server,   die   E/A   zu  synchronisieren,  damit  die  synchrone  Semantik  von  O_DIRECT
       aufrechterhalten wird. Einige Server werden unter diesen Umständen unzureichende  Leistung
       erbringen,  insbesondere  bei kleiner E/A-Größe. Einige Server sind möglicherweise auch so
       konfiguriert, dass sie ihre Clients  darüber  belügen,  dass  die  E/A  stabilen  Speicher
       erreicht   haben.   Dies   wird   die   Leistungseinbuße  bei  gleichzeitigem  Risiko  der
       Datenintegrität im Fall eines Stromausfalls verhindern. Der  Linux-NFS-Client  legt  keine
       Ausrichtungsbeschränkungen bei O_DIRECT-E/A fest.

       In  Zusammenfassung:  O_DIRECT  ist ein extrem leistungsfähiges Werkzeug, das mit Vorsicht
       verwandt werden sollte. Es wird empfohlen, dass Anwendungen die  Verwendung  von  O_DIRECT
       als Leistungssteigerungsoption betrachten, die standardmäßig deaktiviert ist.

              »Was  mich  immer  bei O_DIRECT beunruhigt hat, ist, dass die gesamte Schnittstelle
              einfach nur dumm ist, und wahrscheinlich von einem geistesgestörten Affen unter dem
              Einfluss  ernsthafter  gedächtnisbeeinflussender  Substanzen  entwickelt  wurde.« –
              Linus

FEHLER

       Derzeit ist es nicht möglich, Signal-getriebene E/A  zu  aktivieren,  indem  O_ASYNC  beim
       Aufruf von open() verwandt wird; siehe fcntl(2), um diesen Schalter zu aktivieren.

       Es  muss  auf  zwei  verschiedene  Fehler-Codes,  EISDIR  und  ENOENT geprüft werden, wenn
       versucht wird, zu bestimmen, ob der Kernel die Funktionalität O_TMPFILE unterstützt.

       Wenn sowohl O_CREAT als auch O_DIRECTORY in flags angegeben sind und  die  durch  pathname
       angegebene  Datei  nicht  existiert,  wird  open()  eine  normale  Datei  erstellen  (d.h.
       O_DIRECTORY wird ignoriert).

SIEHE AUCH

       chmod(2), chown(2), close(2), dup(2),  fcntl(2),  link(2),  lseek(2),  mknod(2),  mmap(2),
       mount(2),   open_by_handle_at(2),   read(2),   socket(2),  stat(2),  umask(2),  unlink(2),
       write(2), fopen(3), acl(5), fifo(7), inode(7), path_resolution(7), symlink(7)

KOLOPHON

       Diese Seite  ist  Teil  der  Veröffentlichung  4.15  des  Projekts  Linux-man-pages.  Eine
       Beschreibung  des  Projekts,  Informationen,  wie  Fehler gemeldet werden können sowie die
       aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die  deutsche  Übersetzung  dieser  Handbuchseite  wurde  von  Note:  File  description  →
       Dateideskription,    Helge    Kreutzmann    <debian@helgefjell.de>,    Mario   Blättermann
       <mario.blaettermann@gmail.com>, Chris Leick <c.leick@vollbio.de> und Dr. Tobias  Quathamer
       <toddy@debian.org> erstellt.

       Diese  Übersetzung  ist  Freie  Dokumentation;  lesen  Sie  die GNU General Public License
       Version  3  oder  neuer  bezüglich  der  Copyright-Bedingungen.  Es  wird  KEINE   HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.