Beschreibung | Wenn POSIX-Dateien ausgeführt werden, verhält sich die Funktion XPG4-konform wie folgt: Die Funktion open() verbindet eine Datei mit einem Dateideskriptor. Sie erzeugt eine Dateibeschreibung, die auf eine Datei verweist und einen Dateideskriptor, der auf diese Dateibeschreibung verweist. Der Dateideskriptor wird von anderen Ein-/Ausgabefunktionen genutzt, um auf diese Datei zu verweisen. Das Argument path zeigt auf einen Pfadnamen, der die Datei bezeichnet. open() liefert einen Dateideskriptor für die genannte Datei, der der kleinste, noch nicht geöffnete Dateideskriptor des Prozesses ist. Die Dateibeschreibung ist neu, daher teilt dieser Dateideskriptor sie nicht mit anderen Prozessen im System. Das Dateideskriptor-Kennzeichen FD_CLOEXEC , das mit dem neuen Dateideskriptor verbunden ist, wird gelöscht (siehe
fcntl()
).
Der Lese-/Schreibzeiger wird auf den Dateianfang gesetzt. Das Dateistatus-Byte und der Zugriffsmodus werden entsprechend dem Wert von oflag gesetzt. Die Werte für oflag werden durch bitweise inklusive Oder-Verknüpfung aus den nachfolgenden Kennzeichen erzeugt, die in fcntl.h definiert sind. In Anwendungen muss genau eines der ersten vier der unten aufgeführten Kennzeichen (Zugriffsmodi) im Wert von oflag angegeben sein: O_RDONLY
| Nur zum Lesen öffnen. | O_WRONLY
| Nur zum Schreiben öffnen. | O_RDWR
| Zum Lesen und Schreiben öffnen. Das Ergebnis ist nicht definiert, wenn dieses Kennzeichen auf eine FIFO-Datei angewendet wird. | O_SEARCH
| Dateiverzeichnis zum Suchen öffnen. Das Ergebnis ist nicht definiert, wenn dieses Kennzeichen nicht auf ein Dateiverzeichnis angewendet wird. | Jede Kombination der folgenden zusätzlichen Kennzeichen kann benutzt werden: O_APPEND
| Der Lese-/Schreibzeiger wird vor jedem Schreiben auf das Dateiende gesetzt. | O_CREAT
| Ist die Datei vorhanden, bleibt dieses Kennzeichen wirkungslos, außer die unter O_EXCL angegebenen Bedingungen existieren. Anderenfalls wird die Datei erzeugt und die Benutzernummer der Datei auf die effektive Benutzernummer des Prozesses gesetzt. Die Gruppennummer der Datei wird auf die effektive Gruppennummer des Prozesses oder auf die Gruppennummer des übergeordneten Dateiverzeichnisses der Datei gesetzt. Die Zugriffsrechte der Datei (siehe auch sys/stat.h ) werden auf den Wert von mode gesetzt und dann folgendermaßen verändert: die einzelnen Bits werden mit dem Komplement der Schutzbitmaske des Prozesses Und-verknüpft (siehe auch umask() ); das heißt, alle Bits in den Zugriffsrechten, die in der Schutzbitmaske gesetzt sind, werden gelöscht. Sind andere Bits, als die Schutzbits einer Datei gesetzt, so ist die Wirkung undefiniert. mode hat keinen Einfluss darauf, ob die Datei zum Lesen, zum Schreiben oder zum Lesen und Schreiben geöffnet wird. | O_EXCL
| open() ist erfolglos, wenn O_CREAT und O_EXCL gesetzt sind und die Datei vorhanden ist. Ist die Datei nicht vorhanden, so werden die zwei Aktionen, Prüfung auf Existenz der Datei und Erzeugung der Datei, als eine einzige Aktion behandelt. In diese Aktion kann kein anderer Prozess eingreifen, den open() für denselben Dateinamen und dasselbe Dateiverzeichnis ausführen soll, und der ebenfalls O_EXCL und O_CREAT gesetzt hat. Die Wirkung ist undefiniert, wenn O_CREAT nicht gesetzt ist.
| O_NOCTTY
| Wenn dieses Kennzeichen gesetzt ist und path ein Terminal bezeichnet, bewirkt open() , dass dieses Terminal nicht das steuernde Terminal des Prozesses wird. | O_NONBLOCK
| Wenn eine FIFO zum Lesen oder zum Schreiben geöffnet wird (O_RDONLY oder O_WRONLY ): O_NONBLOCK ist gesetzt: Ein open() zum Lesen kehrt ohne Verzögerung zurück. Ein open() zum Schreiben liefert nur dann einen Fehler, wenn kein Prozess diese Datei zu diesem Zeitpunkt zum Lesen geöffnet hat.
O_NONBLOCK ist nicht gesetzt: Ein open() zum Lesen wartet, bis ein Prozess die Datei zum Schreiben öffnet. Ein open() zum Schreiben wartet, bis ein Prozess die Datei zum Lesen öffnet.
Wenn eine block- oder zeichenorientierte Gerätedatei geöffnet wird, die nichtwartendes Öffnen unterstützt: O_NONBLOCK ist gesetzt: open() kehrt zurück, ohne darauf zu warten, dass das Gerät fertig oder verfügbar ist. Das nachfolgende Verhalten des Gerätes ist gerätespezifisch.
O_NONBLOCK ist nicht gesetzt: Die Funktion open() wartet, bis das Gerät fertig oder verfügbar ist, bevor sie zurückkehrt. Anderenfalls ist das Verhalten von O_NONBLOCK undefiniert.
| O_SYNC
| Wenn O_SYNC für eine normale Datei gesetzt ist, dann verursacht ein Schreibzugriff auf diese Datei, dass der Prozess solange wartet, bis die Daten an die zu Grunde liegende Hardware übergeben wurden. | O_TRUNC
| Wenn die Datei existiert, eine normale Datei ist und erfolgreich mit O_RDWR oder O_WRONLY geöffnet wurde, dann wird ihre Länge auf 0 gekürzt und Eigentümer und Zugriffsrechte bleiben unverändert. Dies hat keine Wirkung auf FIFO- oder Terminal-Gerätedateien. Die Wirkung auf andere Dateiarten ist nicht definiert, da sie von vielen Faktoren abhängig ist. Das Ergebnis bei einer Verwendung von O_TRUNC zusammen mit O_RDONLY ist undefiniert. | O_LARGEFILE
| Falls angegeben, ist das in der internen Beschreibung der offenen Datei festgelegte Offset-Maximum der höchste Wert, der in einem Objekt des Typs off64_t korrekt dargestellt werden kann. | Wenn O_CREAT gesetzt ist und die Datei vorher nicht existierte, dann markiert open() im Erfolgsfall die Felder st_atime , st_ctime und st_mtime der Datei und die Felder st_ctime und st_mtime des übergeordneten Dateiverzeichnisses zum Aktualisieren. Wenn O_TRUNC gesetzt ist und die Datei vorher bereits existierte, dann markiert open() im Erfolgsfall die Felder st_ctime und st_mtime der Datei zum Aktualisieren. Es besteht kein funktionaler Unterschied zwischen open() und open64() , außer dass open64() im File Status Flag implizit das Bit O_LARGEFILE setzt. Die Funktion open64() entspricht der Verwendung der Funktion open() , bei der O_LARGEFILE in oflag gesetzt ist. Werden Threads verwendet, so wirkt sich die Funktion auf den Prozess oder auf einen Thread wie folgt aus: Öffnen einer Datei; Ist beim Parameter oflag O_NONBLOCK nicht gesetzt, gilt für FIFO: Ein open() zum Lesen blockiert den aufrufenden Thread, bis ein Thread die Datei zum Schreiben öffnet. Ein open() zum Schreiben blockiert den Thread, bis ein Thread die Datei zum Lesen öffnet. Wird eine block- oder zeichenorientierte Gerätedatei geöffnet wird, die nichtwartendes Öffnen unterstützt, gilt: Die open() -Funktion blockiert den aufrufenden Thread, bis das Gerät fertig oder verfügbar ist. Erweiterung Wenn O_CREAT und O_EXCL gesetzt sind, und path ein symbolischer Verweis ist, wird der Verweis nicht verfolgt. (Ende) BS2000 Wenn BS2000-Dateien ausgeführt werden, ist Folgendes zu beachten: const char *path ist eine Zeichenkette, die die zu öffnende Datei angibt. path kann jeder gültige BS2000-Dateiname sein: /BS2/link =linkname linkname bezeichnet einen BS2000-Linknamen.
/BS2/(SYSDTA) , /BS2/(SYSOUT) , /BS2/(SYSLST) , die entsprechende Systemdatei
/BS2/(SYSTERM) , Terminal-Ein-/Ausgabe
/BS2/(INCORE) , temporäre Binärdatei, die nur im virtuellen Speicher angelegt wird.
oflag ist eine Konstante, die im Header <stdio.h> definiert ist und die gewünschte Zugriffsart angibt, (oder die entsprechende Oktalzahl) und zwar: O_RDONLY
0000
Öffnen zum Lesen. Die Datei muss bereits vorhanden sein. O_WRONLY
0001
Öffnen zum Schreiben. Die Datei muss bereits vorhanden sein. Der alte Inhalt bleibt erhalten. O_TRUNC|O_WRONLY
01001
Öffnen zum Schreiben. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt. O_RDWR
0002
Öffnen zum Lesen und Schreiben. Die Datei muss bereits vorhanden sein. Der alte Inhalt bleibt erhalten. O_TRUNC|O_RDWR
01002
Öffnen zum Lesen und Schreiben. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt. O_WRRD
0003
Öffnen zum Neuschreiben und Lesen. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt. O_APPEND_OLD|O_WRONLY
0401
Öffnen zum Anfügen ans Ende der Datei. Die Datei muss bereits vorhanden sein. Es wird auf das Dateiende positioniert, d.h. der alte Inhalt bleibt erhalten und der neue Text wird ans Ende der Datei angehängt. O_APPEND_OLD|O_RDWR
0402
Öffnen zum Anfügen ans Ende der Datei und zum Lesen. Die Datei muss bereits vorhanden sein. Der alte Inhalt bleibt erhalten und der neue Text wird ans Ende der Datei angehängt. Nach dem Öffnen ist die Datei bei KR-Funktionalität (nur bei C/C++ Versionen kleiner V3.0 vorhanden) auf das Dateiende positioniert, bei ANSI-Funktionalität auf den Dateianfang. lbp-Schalter Der lbp-Schalter steuert die Behandlung des Last Byte Pointers (LBP). Er ist nur für Binärdateien mit Zugriffsart PAM relevant und kann mit jeder der oben angegebenen Konstanten kombiniert werden. Falls als lbp-Schalter O_LBP angegeben ist, wird geprüft, ob LBP-Unterstützung möglich ist. Ist dies nicht der Fall, so schlägt die Funktion open() , open64() fehl und errno wird auf ENOSYS gesetzt. Weitere Auswirkungen hat der Schalter erst, wenn die Datei geschlossen wird. Beim Öffnen und Lesen einer bestehenden Datei wird der LBP unabhängig vom lbp-Schalter immer berücksichtigt: Ist der LBP der Datei ungleich 0, wird er ausgewertet. Ein eventuell vorhandener Marker wird ignoriert. Ist der LBP = 0, wird nach einem Marker gesucht und die Dateilänge daraus ermittelt. Falls kein Marker gefunden wird, wird das Ende des letzten vollständigen Blocks als Dateiende betrachtet.
O_LBP
Beim Schließen einer Datei, die verändert oder neu erstellt wurde, wird kein Marker geschrieben (auch wenn einer vorhanden war) und ein gültiger LBP gesetzt. Auf diese Weise können Dateien mit Marker auf LBP ohne Marker umgestellt werden.Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K- Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt. O_NOLBP
Beim Schließen einer Datei, die neu erstellt wurde, wird der LBP auf Null (=ungültig) gesetzt. Es wird ein Marker geschrieben. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K-Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt. Beim Schließen einer Datei, die verändert wurde, wird der LBP auf Null (=ungültig) gesetzt. Ein Marker wird nur dann geschrieben, wenn vorher bereits ein Marker vorhanden war. Falls die Datei beim Öffnen einen gültigen LBP besaß, wird kein Marker geschrieben, da in diesem Fall davon ausgegangen wird, dass kein Marker vorhanden ist. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K- Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt. Wird der lbp-Schalter in beiden Varianten angegeben (O_LBP und O_NOLBP ), so schlägt die Funktion open() , open64() fehl und errno wird auf EINVAL gesetzt. Wird der lbp-Schalter nicht angegeben, hängt das Verhalten von der Umgebungsvariablen LAST_BYTE_POINTER ab (siehe auch Abschnitt "Umgebungsvariablen“): LAST_BYTE_POINTER=YES
Die Funktion verhält sich so, als ob O_LBP angegeben wäre. LAST_BYTE_POINTER=NO
Die Funktion verhält sich so, als ob O_NOLBP angegeben wäre. Nosplit-Schalter Dieser Schalter steuert die Verarbeitung von Textdateien mit der Zugriffsart SAM und variabler Satzlänge, wenn zusätzlich eine maximale Satzlänge angegeben ist. Er kann mit jeder der anderen Konstanten kombiniert werden. O_NOSPLIT
Beim Lesen mit read() werden Sätze maximaler Länge nicht mit dem darauffolgenden Satz verkettet. Beim Schreiben mit write() werden Sätze, die länger als die maximale Satzlänge sind, auf die maximale Satzlänge gekürzt. Ist der Schalter nicht angegeben, gilt Folgendes: Beim Schreiben Ein Satz, der länger als die maximale Satzlänge ist, wird in mehrere Sätze aufgeteilt. Hat ein Satz genau die maximale Satzlänge, wird nach diesem ein Satz der Länge Null geschrieben. Beim Lesen Hat ein Satz die maximale Satzlänge, wird angenommen, dass es sich bei dem Folgesatz um die Fortsetzung dieses Satzes handelt und die Sätze werden verkettet.
Zum Eröffnen von Dateien mit satzorientierter Ein-/Ausgabe (Satz-E/A) kann beim Parameter mode die Konstante O_RECORD angegeben werden. Sie kann grundsätzlich mit jeder anderen Konstanten außer O_LBP kombiniert werden. Lediglich bei ISAM-Dateien ist das Anfügen an das Ende der Datei nicht erlaubt, also die Kombination mit 0401 und 0402 . Bei ISAM-Dateien bestimmt sich die Position aus dem Schlüssel im Satz. O_RECORD
Dieser Schalter bewirkt Folgendes: - Die Funktion
read() liest bei Satz-E/A einen Satz (bzw. Block) von der aktuellen Dateiposition. Ist die Anzahl n der zu lesenden Zeichen größer als die aktuelle Satzlänge, wird trotzdem nur dieser Satz gelesen. Ist n kleiner als die aktuelle Satzlänge, werden nur die ersten n Zeichen gelesen. Beim nächsten Lesezugriff werden die Daten des nächsten Satzes gelesen. - Die Funktion
write() schreibt einen Satz in die Datei. Bei SAM- und PAM-Dateien wird der Satz an die aktuelle Dateiposition geschrieben. Bei ISAM-Dateien wird der Satz an die Position geschrieben, die dem Schlüsselwert im Satz entspricht. Ist die Anzahl n der zu schreibenden Zeichen größer als die maximale Satzlänge, wird nur ein Satz mit maximaler Satzlänge geschrieben. Die restlichen Daten gehen verloren. Bei ISAM-Dateien wird ein Satz nur geschrieben, wenn er mindestens einen vollständigen Schlüssel enthält. Ist bei Dateien mit fester Satzlänge n kleiner als die Satzlänge, wird mit binären Nullen aufgefüllt. Beim Update eines Satzes in einer SAM- oder PAM-Datei darf die Länge des Satzes nicht verändert werden. Die Funktion write() liefert auch bei Satz-E/A die Anzahl der tatsächlich geschriebenen Zeichen zurück.
(Ende)
Die Funktionen openat() und openat64() sind äquivalent zu den Funktion open() und open64() , außer wenn der Parameter path einen relativen Pfad spezifiziert. In diesem Fall wird die zu öffnende Datei nicht im aktuellen Dateiverzeichnis, sondern in dem mit dem Dateideskriptor fd verbundenen Dateiverzeichnis geöffnet. Wurde der Dateideskriptor ohne O_SEARCH geöffnet, prüfen die Funktionen, ob eine Suche im verbundenen Dateiverzeichnis mit den dem Dateiverzeichnis zugrunde liegenden Berechtigungen erlaubt ist. Wurde der Dateideskriptor mit O_SEARCH geöffnet, unterbleibt die Prüfung. Der Parameter oflag und der optionale vierte Parameter mode entsprechen exakt den Parametern von open() bzw. open64() . Wenn der Funktion openat() bzw. openat64() für den Parameter fd der Wert AT_FDCWD übergeben wird, wird das aktuelle Dateiverzeichnis benutzt. |
Hinweise | Ob open() für eine BS2000- oder eine POSIX-Datei ausgeführt wird, hängt von der Programmumgebung ab. BS2000 Der BS2000-Dateiname bzw. -Linkname kann in Klein- und Großbuchstaben geschrieben werden, er wird automatisch in Großbuchstaben umgesetzt. Wird eine nicht vorhandene Datei neu angelegt, so wird standardmäßig eine Datei mit folgenden Attributen erzeugt: Bei KR-Funktionalität (nur bei C/C++ Versionen kleiner V3 vorhanden) eine SAM-Datei mit variabler Satzlänge und Standardblocklänge, bei ANSI-Funktionalität eine ISAM-Datei mit variabler Satzlänge und Standardblocklänge.SAM-Dateien sind beim Öffnen mit open() immer Textdateien. Bei Verwendung eines Linknamens lassen sich mit dem ADD-FILE-LINK -Kommando folgende Dateiattribute ändern: Zugriffsmethode, Satzlänge, Satzformat, Blocklänge und Blockformat. In allen Fällen, in denen der alte Inhalt einer bereits existierenden Datei gelöscht wird (0003, 01001), bleiben die Katalogeigenschaften dieser Datei erhalten. Position des Lese-/Schreibzeigers im Anfügemodus: Wenn der Lese-/Schreibzeiger in einer Datei, die im Anfügemodus eröffnet wurde (0401, 0402), explizit vom Dateiende wegpositioniert wurde (lseek() ), wird er je nach KR- oder ANSI-Funktionalität unterschiedlich behandelt. KR-Funktionalität (nur bei C/C++ Versionen kleiner V3 vorhanden): Der aktuelle Lese/Schreibzeiger wird nur beim Schreiben mit der Elementarfunktion write() ignoriert und automatisch ans Ende der Datei positioniert. ANSI-Funktionalität: Der aktuelle Lese-/Schreibzeiger wird bei allen Schreibfunktionen ignoriert und automatisch ans Ende der Datei positioniert. Der Versuch, eine nicht existierende Datei zum Lesen (0000, 0002), zum Ändern (0001) sowie zum Anfügen (0401, 0402) zu öffnen, endet mit Fehler. Eine Datei kann gleichzeitig für verschiedene Zugriffsmodi eröffnet werden, sofern diese Modi im BS2000-Datenverwaltungssystem miteinander verträglich sind. (INCORE)-Dateien können nur zum Neuschreiben (01001) oder zum Neuschreiben und Lesen (0003) geöffnet werden. Es müssen zuerst Daten geschrieben werden. Um die geschriebenen Daten wieder einlesen zu können, muss die Datei mit der Funktion lseek() auf den Dateianfang positioniert werden. Wenn ein Programm startet, werden die Standarddateien für Eingabe, Ausgabe und Fehlerausgabe automatisch mit folgenden Dateideskriptoren geöffnet: (Ende) Es können maximal _NFILE-Dateien gleichzeitig geöffnet sein. _NFILE ist in stdio.h mit 2048 definiert. |