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