Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ lockf(3C) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

alarm(2)

chmod(2)

close(2)

creat(2)

fcntl(2)

open(2)

read(2)

write(2)

unistd(4)

lfs(5)

lockf(3C)                                                         lockf(3C)

NAME
     lockf, lockf64 - Sätze in Dateien sperren

SYNTAX
     #include <unistd.h>

     int lockf(int fildes, int function, offt size);

     int lockf64(int fildes, int function, off64t size);

BESCHREIBUNG
     Mit lockf() können Dateiabschnitte gesperrt werden; dabei hängen emp-
     fohlene oder obligatorische Schreibsperren jeweils von den Modusbits
     der Datei ab [siehe chmod(2)]. Sperraufrufe von anderen Prozessen, die
     versuchen, einen bereits gesperrten Dateiabschnitt zu sperren, führen
     entweder zur Rückgabe eines Fehlerwerts, oder die Prozesse pausieren
     so lange, bis die Ressource wieder freigegeben wird. Alle Sperren für
     einen Prozeß werden aufgehoben, wenn der Prozeß beendet wird.

     fildes ist ein offener Dateideskriptor. Der Dateideskriptor muß über
     die OWRONLY- oder ORDWR-Berechtigung verfügen, damit die Sperre mit
     diesem Funktionsaufruf eingerichtet werden kann.

     function ist ein Steuerwert, der die zu treffenden Maßnahmen angibt. Die
     zulässigen Werte für function sind, wie folgt, in unistd.h definiert:

       #define   FULOCK   0  /* gesperrten Abschnitt freigeben */
       #define   FLOCK    1  /* Abschnitt exklusiv sperren */
       #define   FTLOCK   2  /* Abschnitt testen und exklusiv sperren */
       #define   FTEST    3  /* Abschnitt auf Sperren anderer Prozesse
                                 testen */

     Alle anderen Werte von function sind für zukünftige Erweiterungen
     reserviert und führen zu einer Fehlermeldung, wenn sie nicht implemen-
     tiert sind.

     FTEST wird verwendet, um festzustellen, ob in einem Abschnitt eine
     Sperre eines anderen Prozesses existiert. FLOCK und FTLOCK sperren
     jeweils einen Abschnitt einer Datei, wenn dieser Abschnitt verfügbar
     ist. FULOCK hebt die Sperren eines Dateiabschnitts auf.

     size ist die Anzahl zusammenhängender Bytes, die gesperrt oder ent-
     sperrt werden sollen. Die zu sperrende oder entsperrende Ressource
     beginnt am aktuellen Offset in der Datei und erstreckt sich bei einem
     positiven size-Wert vorwärts und bei einem negativen size-Wert rück-
     wärts (über die vorhergehenden Bytes bis ausschließlich des aktuellen
     Offsets). Wenn size gleich Null ist, wird der Abschnitt vom aktuellen
     Offset bis zum größten Datei-Offset gesperrt, d. h. vom aktuellen Off-
     set bis zum gegenwärtigen oder bis zu jedem zukünftigen Dateiende. Ein
     Bereich braucht nicht einer Datei zugewiesen sein, damit er gesperrt
     werden kann, da diese Sperren auch über das Ende der Datei hinausgehen
     können.



Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

lockf(3C)                                                         lockf(3C)

     Die mit FLOCK oder FTLOCK gesperrten Abschnitte können einen vorher
     von demselben Prozeß gesperrten Abschnitt ganz oder teilweise enthal-
     ten bzw. in diesem Abschnitt enthalten sein. Gesperrte Abschnitte wer-
     den ab dem Punkt des Offsets entsperrt, bis size Bytes entsperrt wor-
     den sind oder bis zum Dateiende, wenn size gleich 0 ist. Wenn diese
     Situation in diesem oder in benachbarten Abschnitten eintritt, werden
     die Abschnitte zu einem Abschnitt zusammengefaßt. Wenn mit der Anfor-
     derung ein neues Element zur Tabelle der aktiven Sperren hinzugefügt
     werden muß und diese Tabelle bereits voll ist, erfolgt eine Fehlermel-
     dung, und der neue Abschnitt wird nicht gesperrt.

     Die Anforderungen von FLOCK und FTLOCK unterscheiden sich nur in der
     Maßnahme, die getroffen wird, wenn die Ressource nicht zur Verfügung
     steht. FLOCK bewirkt, daß der aufrufende Prozeß pausiert, bis die
     Ressource zur Verfügung steht. FTLOCK bewirkt, daß die Funktion -1
     zurückgibt und errno auf den Fehler EACCES setzt, wenn der Abschnitt
     bereits von einem anderen Prozeß gesperrt ist.

     FULOCK-Anforderungen können einen oder mehrere gesperrte, vom Prozeß
     gesteuerte Abschnitte teilweise oder ganz freisetzen. Wenn die
     Abschnitte nicht ganz entsperrt werden, bleiben die übrigen Abschnitte
     weiterhin vom Prozeß gesperrt. Die Freigabe des mittleren Abschnitts
     eines gesperrten Abschnitts erfordert einen zusätzlichen Eintrag in
     der Tabelle der aktiven Sperren. Wenn diese Tabelle voll ist, wird
     errno auf ENOLK gesetzt und der angeforderte Abschnitt nicht freigege-
     ben.

     Eine Anforderung FULOCK, in der die Größe size ungleich Null ist und
     der Offset des letzten Byte des angeforderten Abschnitts dem Maximal-
     wert für ein Objekt des Typs offt entspricht, wird als Anforderung
     zum Aufheben der Sperre vom Anfang des angeforderten Abschnitts mit
     einer Größe size gleich 0 behandelt, wenn der Prozeß eine vorhandene
     Sperre aufweist, in der die Größe 0 ist, und die das letzte Byte des
     angeforderten Abschnitts enthält. Andernfalls versucht die Anforderung
     FULOCK nur die Sperre für den angeforderten Abschnitt aufzuheben.

     Die Möglichkeit einer gegenseitigen Sperre (Deadlock) entsteht, wenn
     ein Prozeß, der eine gesperrte Ressource steuert, durch Anforderung
     der gesperrten Ressource eines anderen Prozesses zum Pausieren veran-
     laßt wird. Daher wird bei Aufruf von lockf() oder fcntl() zunächst auf
     mögliche Deadlocks geprüft, bevor der Prozeß bis zur Freigabe einer
     noch gesperrten Ressource angehalten wird. Wenn das Warten auf eine
     gesperrte Ressource ein Deadlock verursachen würde, wird eine Fehler-
     meldung zurückgegeben.

     Das Warten auf eine Ressource wird mit einem beliebigen Signal unter-
     brochen. Der Systemaufruf alarm() kann für die Bereitstellung einer
     Zeitsperre bei Anwendungen verwendet werden, die eine derartige Ein-
     richtung benötigen.

     Die Interaktion zwischen fcntl()- und lockf()-Sperren ist nicht defi-
     niert.


Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

lockf(3C)                                                         lockf(3C)

     Die Blockierung eines Abschnitts wird durch ein beliebiges Signal
     unterbrochen.

     Es besteht kein funktionaler Unterschied zwischen lockf() und
     lockf64(), außer bei der Interpretation von off64t [siehe lfs(5)].

FEHLER
     Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
     Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
     errno(5).

     lockf() ist erfolglos, wenn einer oder mehrere der nachstehenden
     Punkte wahr sind:

     EBADF       fildes ist kein gültiger offener Dateideskriptor.

     EACCES oder EAGAIN
                 function ist FTLOCK oder FTEST, und der Abschnitt ist
                 bereits von einem anderen Prozeß gesperrt.

     EDEADLK     function ist FLOCK und ein Deadlock würde auftreten.

     ENOLK       function ist FLOCK, FTLOCK oder FULOCK und die Anzahl
                 der Einträge in der Sperrtabelle würde die im System
                 zulässige Anzahl überschreiten.

     ECOMM       fildes ist auf einem fernen Rechner, und die Verbindung zu
                 diesem Rechner ist nicht mehr aktiv.

     EINTR       Während der Ausführung der Funktion wird ein Signal abge-
                 fangen.

     Die Funktion lockf() kann bei folgenden Bedingungen fehlschlagen:

     EAGAIN      Das Argument function ist FLOCK oder FTLOCK, und die
                 Datei wird mit mmap() abgebildet.

     EDEADLK oder ENOLCK
                 Das Argument function ist FLOCK, FTLOCK oder FULOCK,
                 und die Anforderung würde dazu führen, daß die Anzahl der
                 Sperren einen vom System auferlegten Grenzwert überschrei-
                 tet.

     EOPNOTSUPP oder EINVAL
                 Das Sperren von Dateien des durch das Argument fildes
                 angegebenen Typs wird von der Implementierung nicht unter-
                 stützt.

     EINVAL      Das Argument function ist weder FLOCK, FTLOCK, FTEST
                 noch FULOCK; oder size plus dem aktuellen Datei-Offset
                 ist kleiner als 0.



Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

lockf(3C)                                                         lockf(3C)

     EOVERFLOW   Der Offset des ersten Byte oder, wenn die Größe ungleich 0
                 ist, des letzten Byte im angeforderten Abschnitt kann in
                 einem Objekt des Typs offt nicht korrekt dargestellt wer-
                 den.

ERGEBNIS
     Nach erfolgreicher Ausführung wird 0 zurückgegeben. Andernfalls wird
     -1 zurückgegeben, und errno wird zur Anzeige des Fehlers gesetzt.

HINWEISE
     Unerwartete Ergebnisse können in Prozessen auftreten, die im Adreßraum
     des Benutzers puffern. Der Prozeß kann später Daten lesen oder schrei-
     ben, die gesperrt sind bzw. waren. Das Standard-E/A-Paket ist die häu-
     figste Ursache für unerwartete Pufferungen.

     Da die Variable errno in Zukunft auf EAGAIN und nicht auf EACCES
     gesetzt wird, wenn ein Dateiabschnitt bereits von einem anderen Prozeß
     gesperrt ist, müssen portierbare Anwenderprogramme von beiden Werten
     ausgehen und auch beide Werte prüfen.

SIEHE AUCH
     alarm(2), chmod(2), close(2), creat(2), fcntl(2), open(2), read(2),
     write(2), unistd(4), lfs(5).































Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

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