Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ open(2) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

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)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026