Zusammenfassung
#umfassen
Beschreibung
Dasöffnen() Ein Systemaufruf-Befehl wird verwendet, um einen Pfadnamen in einen Dateideskriptor zu konvertieren (eine kleine, nicht negative Ganzzahl, die in nachfolgenden E / A wie bei verwendet wird lesen, schreiben, usw.). Wenn der Aufruf erfolgreich ist, wird der zurückgegebene Dateideskriptor der niedrigste Dateideskriptor sein, der derzeit nicht für den Prozess geöffnet ist. Dieser Aufruf erstellt eine neue geöffnete Datei, die nicht mit einem anderen Prozess geteilt wird. (Freigegebene Dateien können jedoch über dieGabel(2) Systemaufruf.) Der neue Dateideskriptor ist so eingestellt, dass er über die ausführenden Funktionen geöffnet bleibt (siehefcntl(2)). Der Dateioffset wird an den Anfang der Datei gesetzt.
Der Parameter Flaggen ist einer vonO_RDONLY, O_WRONLY oderO_RDWR welche Anforderung die Datei schreibgeschützt, schreibgeschützt bzw. lese- / schreibweise bitweise öffnet. oder mit null oder mehr der folgenden Werte:
O_CREAT
Wenn die Datei nicht existiert, wird sie erstellt. Der Eigentümer (Benutzer-ID) der Datei wird auf die effektive Benutzer-ID des Prozesses festgelegt. Der Gruppeneigentum (Gruppen-ID) wird entweder auf die effektive Gruppen-ID des Prozesses oder auf die Gruppen-ID des übergeordneten Verzeichnisses festgelegt (abhängig vom Dateisystemtyp und den Mount-Optionen und dem Modus des übergeordneten Verzeichnisses, siehe z. B. das Mount) Optionen bsdgroups und sysvgroups des ext2-Dateisystems, wie in beschriebenmontieren(8)).
O_EXCL
Bei Verwendung mitO_CREATWenn die Datei bereits existiert, ist dies ein Fehleröffnen wird versagen. In diesem Zusammenhang gibt es eine symbolische Verbindung, unabhängig davon, wo sie verweist.O_EXCL ist auf NFS-Dateisystemen defekt. Programme, die darauf angewiesen sind, um Sperraufgaben auszuführen, enthalten eine Race-Bedingung. Die Lösung zum Durchführen einer atomaren Dateisperrung mithilfe einer Sperrdatei besteht darin, eine eindeutige Datei auf denselben Dateisystemen (z. B. Hostname und PID) zu erstellen. Verwenden Sie link (2), um eine Verknüpfung mit der Sperrdatei herzustellen. ObVerknüpfung() gibt 0 zurück, die Sperre ist erfolgreich. Ansonsten verwenden stat(2) für die eindeutige Datei, um zu prüfen, ob die Anzahl der Links auf 2 gestiegen ist. In diesem Fall ist die Sperre ebenfalls erfolgreich.
O_NOCTTY
Ob Pfadname bezieht sich auf ein Endgerät --- siehetty(4) --- es wird nicht das steuernde Terminal des Prozesses, auch wenn der Prozess keinen hat.
O_TRUNC
Wenn die Datei bereits existiert und eine reguläre Datei ist und der offene Modus das Schreiben zulässt (d. H. O_RDWR oder O_WRONLY), wird sie auf Länge 0 gekürzt. Wenn es sich bei der Datei um eine FIFO- oder Endgerätedatei handelt, wird das O_TRUNC-Flag ignoriert. Andernfalls ist die Wirkung von O_TRUNC nicht festgelegt. (Bei vielen Linux-Versionen wird es ignoriert; bei anderen Versionen wird ein Fehler zurückgegeben.)
O_APPEND
Die Datei wird im Anfügemodus geöffnet. Vor jedemschreibenDer Dateizeiger wird wie bei mit am Ende der Datei positioniertlseek. O_APPEND kann zu beschädigten Dateien auf NFS-Dateisystemen führen, wenn mehrere Prozesse gleichzeitig Daten an eine Datei anhängen. Dies ist darauf zurückzuführen, dass NFS das Anhängen an eine Datei nicht unterstützt. Daher muss der Client-Kernel diese simulieren. Dies ist jedoch nicht ohne Race-Bedingung möglich.
O_NONBLOCK oderO_NDELAY
Wenn möglich, wird die Datei im nicht blockierenden Modus geöffnet. Weder dieöffnen noch alle nachfolgenden Operationen des zurückgegebenen Dateideskriptors führen dazu, dass der aufrufende Prozess wartet. Zum Umgang mit FIFOs (Named Pipes) siehe auchfifo(4). Dieser Modus muss keine Auswirkungen auf andere Dateien als FIFOs haben.
O_SYNC
Die Datei wird für synchrone E / A geöffnet. Irgendeinschreibens auf dem resultierenden Dateideskriptor blockiert den aufrufenden Prozess, bis die Daten physisch auf die zugrunde liegende Hardware geschrieben wurden. Siehe auch Einschränkungen unten.
O_NOFOLLOW
Ob Pfadname Ist ein symbolischer Link, schlägt das Öffnen fehl. Dies ist eine FreeBSD-Erweiterung, die in Version 2.1.126 zu Linux hinzugefügt wurde. Symbolische Links in früheren Komponenten des Pfadnamens werden weiterhin verfolgt. Die Header von glibc 2.0.100 und höher enthalten eine Definition dieses Flags. Kernel vor 2.1.126 ignorieren sie, wenn sie verwendet werden .
O_DIRECTORY
Ob Pfadname ist kein Verzeichnis, das Öffnen kann fehlschlagen. Dieses Flag ist Linux-spezifisch und wurde in Kernel-Version 2.1.126 hinzugefügt, um Denial-of-Service-Probleme zu vermeidenopendir(3) wird auf einem FIFO- oder Bandgerät aufgerufen, sollte jedoch nicht außerhalb der Implementierung von verwendet werdenopendir.
O_DIRECT
Versuchen Sie, die Cache-Effekte der E / A zu und von dieser Datei zu minimieren. Im Allgemeinen verringert dies die Leistung, ist jedoch in besonderen Situationen hilfreich, wenn z. B. Anwendungen ihre eigene Zwischenspeicherung durchführen. Die Dateieingabe / -ausgabe erfolgt direkt zu / von Benutzer-Space-Puffern. Die E / A ist synchron, d.h. lesen(2) oderschreiben(2) Systemaufruf, Daten werden garantiert übertragen. Die Übertragungsgrößen und die Ausrichtung von Benutzerpuffer und Dateiversatz müssen ein Vielfaches der logischen Blockgröße des Dateisystems sein.Dieses Flag wird auf einer Reihe von Unix-ähnlichen Systemen unterstützt. Unterstützung wurde unter Linux in der Kernel-Version 2.4.10 hinzugefügt.Eine semantisch ähnliche Schnittstelle für Blockgeräte ist in beschriebenroh(8). O_ASYNC Erzeugen Sie ein Signal (standardmäßig SIGIO, dies kann aber über geändert werdenfcntl(2)) wenn Eingabe oder Ausgabe dieses Dateideskriptors möglich wird. Diese Funktion ist nur für Terminals, Pseudo-Terminals und Steckdosen verfügbar. Sehenfcntl(2) für weitere Details. O_LARGEFILE Auf 32-Bit-Systemen, die das Large Files System unterstützen, können Dateien geöffnet werden, deren Größe nicht in 31 Bit dargestellt werden kann. Einige dieser optionalen Flags können mit geändert werdenfcntl nachdem die Datei geöffnet wurde. Das Argument Modus Gibt die Berechtigungen an, die verwendet werden sollen, wenn eine neue Datei erstellt wird. Es wird vom Prozess modifiziertUmask in der üblichen Weise: Die Berechtigungen der erstellten Datei sind(mode & ~ umask). Beachten Sie, dass dieser Modus nur für zukünftige Zugriffe auf die neu erstellte Datei gilt. dasöffnenEin Aufruf, der eine schreibgeschützte Datei erstellt, kann durchaus einen Lese- / Schreibdateideskriptor zurückgeben. Die folgenden symbolischen Konstanten sind vorgesehen Modus : S_IRWXU 00700 Benutzer (Dateieigentümer) hat Lese-, Schreib- und Ausführungsberechtigung S_IRUSR (S_IREAD) 00400 Benutzer hat Leseberechtigung S_IWUSR (S_IWRITE) 00200 Benutzer hat Schreibberechtigung S_IXUSR (S_IEXEC) 00100 Benutzer hat Ausführungsberechtigung S_IRWXG 00070 Gruppe hat Lese-, Schreib- und Ausführungsberechtigung S_IRGRP 00040 Gruppe hat Leseberechtigung S_IWGRP 00020 Gruppe hat Schreibberechtigung S_IXGRP 00010 Gruppe hat Ausführungsberechtigung S_IRWXO 00007 andere haben die Berechtigung zum Lesen, Schreiben und Ausführen S_IROTH 00004 andere haben Leseberechtigung S_IWOTH 00002 andere haben Schreibberechtigung S_IXOTH 00001 andere haben Ausführungserlaubnis Modus muss angegeben werden, wannO_CREAT ist in dem Flaggen und wird sonst ignoriert. erstellen ist äquivalent zuöffnen mit Flaggen gleichO_CREAT | O_WRONLY | O_TRUNC. RÜCKGABEWERT öffnen understellen den neuen Dateideskriptor zurückgeben oder -1, wenn ein Fehler aufgetreten ist (in diesem Fall errno wird entsprechend eingestellt). Beachten Sie, dassöffnen kann spezielle Gerätedateien öffnen, abererstellen kann sie nicht erstellen - verwendenmknod(2) stattdessen. Auf NFS-Dateisystemen mit aktivierter UID-Zuordnungöffnen kann einen Dateideskriptor zurückgeben, aber z. lesen(2) Anträge werden mit abgelehntEACCES. Dies liegt daran, dass der Client die Leistung erbringtöffnen durch Überprüfen der Berechtigungen, aber die UID-Zuordnung wird vom Server bei Lese- und Schreibanforderungen ausgeführt. Wenn die Datei neu erstellt wird, werden die Felder atime, ctime und mtime auf die aktuelle Uhrzeit gesetzt, ebenso die Felder ctime und mtime des übergeordneten Verzeichnisses. Andernfalls werden die Felder ctime und mtime auf die aktuelle Uhrzeit gesetzt, wenn die Datei aufgrund des O_TRUNC-Flags geändert wird. EEXIST Pfadname existiert bereits undO_CREAT undO_EXCL wurden benutzt. EISDIR Pfadname bezieht sich auf ein Verzeichnis und den angeforderten Zugriff mitO_WRONLY oderO_RDWR gesetzt ist). EACCES Der angeforderte Zugriff auf die Datei ist nicht zulässig, oder eines der Verzeichnisse in Pfadname erlaubte keine Such- (Ausführungs-) Berechtigung oder die Datei war noch nicht vorhanden und Schreibzugriff auf das übergeordnete Verzeichnis ist nicht zulässig. ENAMETOOLONG Pfadname war zu lang ENOENT O_CREAT ist nicht festgelegt und die genannte Datei ist nicht vorhanden. Oder eine Verzeichniskomponente in Pfadname existiert nicht oder ist ein symbolischer Link. ENOTDIR Eine Komponente, die als Verzeichnis in verwendet wird Pfadname ist eigentlich kein Verzeichnis oderO_DIRECTORYwurde angegeben und Pfadname war kein Verzeichnis. ENXIO O_NONBLOCK | O_WRONLY ist gesetzt, die benannte Datei ist ein FIFO und kein Prozess hat die Datei zum Lesen geöffnet. Die Datei ist eine spezielle Gerätedatei, und es ist kein entsprechendes Gerät vorhanden. ENODEV Pfadname bezieht sich auf eine spezielle Gerätedatei und es ist kein entsprechendes Gerät vorhanden. (Dies ist ein Linux-Kernel-Fehler - in dieser Situation muss ENXIO zurückgegeben werden.) EROFS Pfadname bezieht sich auf eine Datei in einem schreibgeschützten Dateisystem, und der Schreibzugriff wurde angefordert. ETXTBSY Pfadname bezieht sich auf ein ausführbares Abbild, das gerade ausgeführt wird und der Schreibzugriff angefordert wurde. EFAULT Pfadname Punkte außerhalb Ihres zugänglichen Adressraums. ELOOP Beim Auflösen wurden zu viele symbolische Links gefunden Pfadname , oderO_NOFOLLOW wurde aber angegeben Pfadname war eine symbolische Verbindung. ENOSPC Pfadname sollte aber das Gerät enthalten Pfadname hat keinen Platz für die neue Datei. ENOMEM Es war nicht genügend Kernelspeicher verfügbar. EMFILE Der Prozess hat bereits die maximale Anzahl offener Dateien. ENFILE Das Limit für die Gesamtzahl der auf dem System geöffneten Dateien wurde erreicht. SVr4, SVID, POSIX, X / OPEN, BSD 4.3 DieO_NOFOLLOW undO_DIRECTORY Flags sind Linux-spezifisch. Man muss vielleicht das definieren_GNU_SOURCE Makro, um ihre Definitionen zu erhalten. Das Protokoll, das NFS zugrunde liegt, weist viele Unzulänglichkeiten auf, die unter anderem betroffen sindO_SYNC undO_NDELAY. POSIX bietet drei verschiedene Varianten synchronisierter E / A an, die den Flags entsprechenO_SYNC , O_DSYNC und O_RSYNC. Zur Zeit (2.1.130) sind dies alle unter Linux. Fehler
Entsprechend
Beschränkungen