open(2) open(2)
NAME
open, open64 - Datei zum Schreiben oder Lesen öffnen
SYNTAX
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int oflag, ... /* modet mode */);
int open64(const char *path, int oflag, ...);
BESCHREIBUNG
Die Funktion open() stellt die Verbindung zwischen einer Datei und
einem Dateideskriptor her. Sie erstellt eine offene Dateibeschreibung,
die auf eine Datei verweist, und einen Dateideskriptor, der auf diese
offene Dateibeschreibung verweist. Der Dateideskriptor wird von ande-
ren Ein-/Ausgabefunktionen verwendet, um eine Datei anzugeben. Das
Argument path zeigt auf einen Pfadnamen, der die Datei benennt.
Die Funktion open() gibt einen Dateideskriptor für die genannte Datei
zurück, und verwendet hierbei den niedrigsten für den Prozeß derzeit
noch nicht geöffneten Dateideskriptor. Die offene Dateibeschreibung
ist neu, so daß der Dateideskriptor diese Beschreibung nicht gemeinsam
mit anderen Prozessen im System verwendet. Das Flag FDCLOEXEC, das
dem neuen Dateideskriptor zugeordnet ist, wird gelöscht.
Der zum Markieren der aktuellen Position in der Datei verwendete
Datei-Offset wird an den Dateianfang gesetzt.
Die Dateistatus-Flags und Dateizugriffsmodi der offenen Dateibeschrei-
bung werden entsprechend dem Wert von oflag gesetzt.
Werte für oflag werden durch bitweise, inklusive OR-Verknüpfung von
Flags aus folgender Liste gebildet, die in fcntl.h definiert sind.
Anwendungen müssen einen der drei untenstehenden Werte (Dateizugriffs-
modi) im Wert von oflag angeben:
ORDONLY Nur zum Lesen öffnen
OWRONLY Nur zum Schreiben öffnen
ORDWR Zum Lesen und Schreiben öffnen
Eine beliebige Kombination aus folgenden Werten kann verwendet werden:
ONONBLOCK Nachfolgendes Lesen und Schreiben beeinflussen [siehe
read(2) und write(2)].
Wenn eine FIFO-Datei mit gesetztem ORDONLY oder OWRONLY
geöffnet wird, hat das folgende Auswirkung:
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
open(2) open(2)
Bei gesetztem ONONBLOCK:
Ein open() nur zum Lesen kehrt sofort zurück; ein
open() nur zum Schreiben gibt einen Fehler zurück,
wenn zum gegebenen Zeitpunkt kein Prozeß die Datei zum
Lesen geöffnet hat.
Bei leerem ONONBLOCK:
Ein open() nur zum Lesen wirkt als Blockierung, bis
ein Prozeß die Datei zum Schreiben öffnet. Ein open()
nur zum Schreiben wirkt als Blockierung, bis ein Pro-
zeß die Datei zum Lesen öffnet.
Wird eine einer Terminal-Leitung zugeordnete Datei geöff-
net, hat das folgende Auswirkung:
Bei gesetztem ONONBLOCK:
open() wartet nicht darauf, daß das Gerät bereit oder
verfügbar wird, sondern kehrt sofort zurück; das wei-
tere Verhalten des Geräts ist gerätespezifisch.
Bei leerem ONONBLOCK:
open() ist blockiert, bis das Gerät bereit oder ver-
fügbar ist.
OAPPEND Der Schreib-/Lesezeiger wird vor jedem Schreiben an das
Ende der Datei gestellt.
OSYNC Beim Öffnen einer regulären Datei ist nachfolgendes Schrei-
ben beeinträchtigt. Jedes write(2) wartet auf die physische
Aktualisierung von Dateidaten und Dateistatus.
ONOCTTY Ist die Datei einem Terminal zugeordnet, wird das Terminal
nicht als das steuernde Terminal des aufrufenden Prozesses
zugeordnet.
OCREAT Wenn die Datei bereits vorhanden ist, hat dieses Flag keine
Auswirkungen, mit Ausnahme der unter OEXCL beschriebenen.
Andernfalls wird die Datei erstellt; die Benutzer-ID der
Datei wird auf die effektive Benutzer-ID des Prozesses
gesetzt. Die Gruppen-ID der Datei wird auf die Gruppen-ID
des übergeordneten Verzeichnisses oder auf die effektive
Gruppen-ID des Prozesses gesetzt. Die Zugriffsberechti-
gungsbits [siehe <sys/stat.h> in stat(5)] des Dateimodus
werden auf den Wert des dritten Arguments gesetzt, das als
Typ modet aufgefaßt und wie folgt geändert wird: Die
Dateimodusbits und die zugehörigen Bits in der entsprechen-
den Dateimodus-Erstellungsmaske des Prozesses werden durch
bitweises AND verknüpft. Auf diese Weise werden alle Bits
im Dateimodus, deren Entsprechungen in der Dateimodus-
Erstellungsmaske gesetzt sind, gelöscht. Sind andere als
die Zugriffsberechtigungsbits gesetzt, ist das Ergebnis
unbestimmt. Das dritte Argument hat keine Auswirkungen
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
open(2) open(2)
darauf, ob die Datei für Lesen und/oder Schreiben geöffnet
ist.
OTRUNC Wenn die Datei vorhanden ist, und es sich um eine reguläre
Datei handelt, und wenn die Datei erfolgreich für ORDWR
oder OWRONLY geöffnet wurde, wird die Dateilänge auf 0
abgeschnitten und weder der Modus noch der Eigentümer der
Datei werden geändert. Das Flag hat keine Auswirkungen auf
FIFO-Gerätedateien oder Terminalgerätedateien. Die Auswir-
kungen auf andere Dateitypen sind implementierungsspezi-
fisch. Das Ergebnis bei Verwendung von OTRUNC mit ORDONLY
ist unbestimmt.
OEXCL Bei gesetztem OEXCL und OCREAT ist open() erfolglos, wenn
die Datei vorhanden ist. Der Test auf die Existenz der
Datei und die Erstellung der Datei, wenn sie nicht exi-
stiert, ist atomar in bezug auf andere Prozesse, die open()
ausführen und denselben Dateinamen und dasselbe Verzeichnis
verwenden und OEXCL und OCREAT gesetzt haben.
Der folgende zusätzliche Wert kann beim Erstellen von oflag verwendet
werden:
OLARGEFILE
Falls angegeben, ist das in der internen Beschreibung der offenen
Datei festgelegte Offset-Maximum der höchste Wert, der in einem
Objekt des Typs off64t korrekt dargestellt werden kann.
Beim Öffnen einer STREAMS-Datei kann oflag den Wert ONONBLOCK haben.
Zu diesem Wert kann noch ORDONLY, OWRONLY oder ORDWR durch bitwei-
ses OR hinzugefügt werden. Andere Werte können bei STREAMS-Geräten
nicht angewendet werden, und haben auf solche Geräte keine Wirkung.
Der Wert von ONONBLOCK beeinflußt die Ausführung von STREAMS-Treibern
und bestimmten Systemaufrufen [siehe read(2), getmsg(2), putmsg(2) und
write(2)]. Bei Treibern ist die Implementierung von ONONBLOCK geräte-
spezifisch. Jeder STREAMS-Gerätetreiber kann diese Option anders
behandeln.
Wenn path die Master-Seite eines Pseudo-Terminals angibt, ist nicht
definiert, ob open() die Slave-Seite sperrt, so daß sie nicht geöffnet
werden kann. Portierbare Anwendungen müssen unlockpt() aufrufen, bevor
die Slave-Seite geöffnet wird.
Wenn open() aufgerufen wird, um einen Stream mit einem Namen zu erzeu-
gen, auf den das connld-Modul [siehe connld(7)] gesetzt wurde, so
blockiert der open()-Aufruf, bis der Bedienerprozeß einen IRECVFD
ioctl-Aufruf [siehe streamio(7)] durchführt, um den Dateideskriptor zu
empfangen.
Wenn path ein symbolischer Verweis ist und OCREAT und OEXCL gesetzt
sind, wird der Verweis nicht verfolgt.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
open(2) open(2)
Der zur Kennzeichnung der aktuellen Position innerhalb der Datei ver-
wendete Schreib-/Lesezeiger wird auf den Anfang der Datei gesetzt.
Der neue Dateideskriptor ist der kleinste verfügbare Dateideskriptor,
und er wird so gesetzt, daß er bei exec-Systemaufrufen offen bleibt
[siehe fcntl(2)].
Einige Schalter können nach einem open()-Aufruf gesetzt werden. Siehe
dazu fcntl(2).
Wenn OCREAT gesetzt ist und die Datei vorher noch nicht existierte,
kennzeichnet open() nach erfolgreicher Beendigung die Felder statime,
stctime und stmtime der Datei und die Felder stctime und stmtime
des übergeordneten Verzeichnisses zur Aktualisierung.
Wenn OTRUNC gesetzt ist und die Datei vorher schon existierte, kenn-
zeichnet open() nach erfolgreicher Beendigung die Felder stctime und
stmtime zur Aktualisierung.
Die Funktion open64() entspricht der Verwendung der Funktion open(),
bei der OLARGEFILE in oflag gesetzt ist.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
Die angegebene Datei wird nicht geöffnet, wenn eine der folgenden
Bedingungen erfüllt ist:
EACCES Die Datei existiert nicht und im übergeordneten Ver-
zeichnis der zu erzeugenden Datei gibt es keine Schreib-
erlaubnis.
EACCES OTRUNC ist angegeben, und es gibt keine Schreiberlaub-
nis.
EACCES Eine Komponente des Pfades darf nicht durchsucht werden.
EACCES Die oflag-Erlaubnis für eine existierende Datei wird
verweigert.
EAGAIN Die Datei ist vorhanden, obligatorisches Sperren von
Dateien und Dateisätzen ist gesetzt, und Datensatzsper-
ren sind noch in der Datei vorhanden [siehe chmod(2)].
EEXIST OCREAT und OEXCL sind gesetzt, und die angegebene
Datei ist vorhanden.
EFAULT path weist über den zugewiesenen Adreßraum des Prozesses
hinaus.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
open(2) open(2)
EINTR Ein Signal wurde während des Systemaufrufs open() abge-
fangen.
EIO Während des Öffnens eines STREAMS-orientierten Gerätes
ist ein Verbindungsabbau (Hangup) oder ein Fehler aufge-
treten.
EISDIR Die angegebene Datei ist ein Verzeichnis, und oflag ist
für Schreiben oder Schreiben/Lesen gesetzt.
ELOOP Bei der Auflösung von path wurden zuviele symbolische
Links angetroffen.
EMFILE Der Prozeß hat zuviele geöffnete Dateien [siehe
getrlimit(2)].
EMULTIHOP Komponenten von path erfordern den Sprung auf mehrere
ferne Rechner, und der Dateisystemtyp erlaubt dies
nicht.
ENAMETOOLONG Das Argument path ist länger als PATHMAX, oder eine
Pfadkomponente ist länger als NAMEMAX.
ENFILE Die Dateitabelle des Systems ist voll.
ENOENT OCREAT ist nicht gesetzt, und die angegebene Datei ist
nicht vorhanden.
ENOENT OCREAT ist gesetzt, und eine Pfadkomponente existiert
nicht oder ist der Null-Pfadname.
ENOLINK path weist auf einen fernen Rechner, und die Verbindung
zu diesem Rechner ist nicht mehr aktiv.
ENOSPC OCREAT und OEXCL sind gesetzt, und das Dateisystem hat
keine I-Nodes mehr.
ENOSPC OCREAT ist gesetzt, und das Verzeichnis für die Datei
kann nicht erweitert werden.
ENOSR Ein Stream kann nicht zugewiesen werden.
ENOTDIR Eine Komponente des Pfades ist kein Verzeichnis.
ENXIO Die angegebene Datei ist eine zeichen- oder blockorien-
tierte Gerätedatei, und das zu dieser Gerätedatei gehö-
rende Gerät ist nicht vorhanden.
ENXIO ONONBLOCK ist gesetzt, die angegebene Datei ist eine
FIFO-Datei, OWRONLY ist gesetzt, und kein Prozeß hat
die Datei zum Lesen geöffnet.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
open(2) open(2)
ENXIO Eine Eröffnungsroutine für STREAMS-Modul oder -Treiber
war erfolglos.
EROFS Die angegebene Datei steht in einem schreibgeschützten
Dateisystem, und entweder OWRONLY, ORDWR, OCREAT oder
OTRUNC ist in oflag gesetzt (wenn die Datei nicht exi-
stiert).
Die Funktion open() kann bei folgenden Bedingungen fehlschlagen:
EAGAIN Das Argument path gibt die Slave-Seite eines gesperrten
Pseudo-Terminals an.
EINVAL Der Wert des Arguments oflag ist ungültig.
ENAMETOOLONG Die Auflösung des Pfadnamens eines symbolischen Links
hat ein Zwischenergebnis erzeugt, dessen Länge PATHMAX
überschreitet.
ENOMEM Das Argument path gibt eine STREAMS-Datei an, und das
System kann keine Ressourcen zuordnen.
ETXTBSY Die Datei ist eine reine Programmdatei, die gerade aus-
geführt wird, und oflag ist für Lesen oder Lesen/Schrei-
ben gesetzt.
EOVERFLOW Die genannte Datei ist eine reguläre Datei, OLARGEFILE
ist nicht gesetzt, und die Größe der Datei kann in einem
Objekt des Typs offt nicht korrekt dargestellt werden.
ERGEBNIS
Nach erfolgreicher Ausführung wird der Dateideskriptor zurückgegeben.
Andernfalls wird -1 zurückgegeben und errno zur Anzeige des Fehlers
gesetzt.
HINWEISE
open() schlägt fehl, wenn die Größe der (regulären) Datei in einem
Objekt des Typs offt nicht korrekt dargestellt werden kann.
Die Größe der Datei, die von einem Programm verarbeitet werden kann,
wird durch den für open() aktuell verwendeten Typ offt bestimmt. Die
Eröffnungsschutzregel stellt sicher, daß alte Binärprogramme nicht für
Dateien verwendet werden können, die für eine korrekte Verarbeitung zu
groß sind und verhindert, daß Binärprogramme falsche Ergebnisse gene-
rieren oder die Daten in der Datei zerstören.
Ein Argument gegen den Eröffnungsschutz ist, daß durch das erforderli-
che Fehlschlagen bei Dateieröffnungen einige Binärprogramme abgebro-
chen werden, die andernfalls einwandfrei funktioniert hätten.
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
open(2) open(2)
Ein weiteres Argument gegen den Eröffnungsschutz ist, daß dieser
Schutz unnötig ist, da ja ein Fehler ausgegeben wird, sobald eine
Funktion nicht das richtige Ergebnis für eine Operation zurückliefern
kann ("No Lies"-Regel). Allerdings überprüfen die meisten Programme
zwar die erfolgreiche Ausführung des open()-Aufrufs, nicht jedoch, ob
ein Überlauf oder Fehler nach lseek() und anderen Aufrufen aufgetreten
ist. Bei einer Überprüfung (Audit) der Standardkommandos wurden zahl-
reiche Beispiele hierfür aufgedeckt.
Ein Argument für den Eröffnungsschutz ist, daß hierdurch die Wahr-
scheinlichkeit für die Ausgabe einer sofortigen und informativen Feh-
lernachricht erhöht wird. In der Fehlernachricht ist höchstwahrschein-
lich der Name der Datei aufgeführt, die nicht geöffnet werden konnte.
Dagegen ist es weitaus unwahrscheinlicher, daß eine lseek()-Fehler-
nachricht genauso unmittelbar ausgegeben wird und ebenso informativ
ist. Die Verzögerung bei oder das völlige Ausbleiben der Meldung sol-
cher Fehler kann zu einem nicht offensichtlichen Fehlschlagen (silent
failure) führen.
Ein weiteres Argument für den Eröffnungsschutz liegt darin, daß es
zahlreiche plausible Szenarien gibt, in denen diese Regel schwere
Schäden verhindern kann. So wird beispielsweise verhindert, daß typi-
sche Implementierungen des Kommandos touch große Dateien auf die Länge
0 abschneiden. Ferner kann ein nicht offensichtlicher Fehler verhin-
dert werden, der, wie sich gezeigt hat, zumindest bei einem kommer-
ziellen Datenverwaltungssystem bereits aufgetreten ist. Mit dem Eröff-
nungsschutz meldet ein kommerzielles Sicherungs-/Wiederherstellungs-
system (Backup/Restore) Fehler in Dateien, die andernfalls dazu führen
können, daß ein Sicherungsband beschädigte Daten enthält. Außerdem
wird verhindert, daß typische Implementierungen von dbm/ndbm falsche
Ergebnisse aus einer Datenbank zurückgeben, deren Größe den für dbm-
Routinen aktuell verwendeten offt-Typ überschreitet.
SIEHE AUCH
chmod(2), close(2), creat(2), dup(2), exec(2), fcntl(2), getrlimit(2),
lseek(2), read(2), getmsg(2), putmsg(2), stat(2), umask(2), write(2),
fcntl(5), lfs(5), stat(5), types(5).
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98