BEZEICHNUNG¶
flock - sperrt und entsperrt beratend Dateien
ÜBERSICHT¶
#include <sys/file.h>
int flock(int fd, int operation);
BESCHREIBUNG¶
Diese Funktion sperrt oder entsperrt beratend die offenen Datei, die
fd
angibt. Das Argument
operation ist eines der folgenden:
- LOCK_SH
- Richtet eine gemeinsame Sperre ein. Mehrere Prozesse
können eine Datei zur selben Zeit sperren.
- LOCK_EX
- Richtet eine exklusive Sperre ein. Nur ein Prozess kann zu
einer Zeit eine Datei sperren.
- LOCK_UN
- entfernt eine von diesem Prozess gehaltene Sperre.
Ein Aufruf von
flock() kann blockieren, wenn von einem anderen Prozess
eine inkompatible Sperre gehalten wird. Um eine nichtblockierende Anfrage zu
machen, verbinden Sie
LOCK_NB (mittels ODER) mit irgendeiner der obigen
Operationen.
Eine einzelne Datei kann nicht gleichzeitig gemeinsame und alleinige Sperren
haben.
Mit
flock() erstellte Sperren sind mit einem offenen Eintrag in der
Dateitabelle verbunden. Dies bedeutet, dass Kopien der Dateideskriptoren
(erzeugt durch zum Beispiel
fork(2) oder
dup(2)) sich auf die
gleiche Sperre beziehen. Diese Sperre kann von jedem dieser Deskriptoren
modifiziert oder freigegeben werden. Weiterhin wird die Sperre entweder durch
eine explizite
LOCK_UN-Operation auf jedem dieser doppelten
Deskriptoren freigegeben oder wenn alle derartigen Deskriptoren geschlossen
wurden.
Falls ein Prozess
open(2) (oder etwas Ähnliches) verwendet um
mehrere Deskriptoren für dieselbe Datei zu erhalten, werden diese
Deskriptoren von
flock() unabhängig behandelt. Ein Versuch, die
Datei mit einem dieser Dateideskriptoren zu sperren kann durch eine Sperre
verwehrt werden, die der aufrufende Prozess bereits für einen anderen
Deskriptor eingerichtet hat.
Ein Prozess darf nur einen Typ vor Sperre (gemeinsam oder exklusiv) auf eine
Datei halten. Nachfolgende Aufrufe von
flock() für eine bereits
gesperrte Datei wird eine bestehende Sperre zum neuen Sperrmodus ändern.
Von
flock() angelegte Sperren bleiben über einen Aufruf von
execve(2) erhalten.
Eine Datei kann unabhängig vom Modus, mit dem sie geöffnet wurde, mit
einer gemeinsamen oder exklusiven Sperre versehen werden.
RÜCKGABEWERT¶
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1
zurückgegeben und
errno entsprechend gesetzt.
FEHLER¶
- EBADF
- fd ist kein Deskriptor für eine geöffnete
Datei.
- EINTR
- Während des Wartens auf die Sperre wurde der Aufruf
durch ein von einem Handler abgefangenes Signal unterbrochen; siehe
signal(7).
- EINVAL
- operation ist ungültig.
- ENOLCK
- Der Kernel hatte keinen Speicher mehr für das Anlegen
von Sperrdatensätzen (lock records).
- EWOULDBLOCK
- Die Datei ist gesperrt und der Schalter LOCK_NB
wurde gewählt.
4.4BSD (der Systemaufruf
flock() erschien erstmals in 4.2BSD). Eine
Version von
flock(), möglicherweise in Form von
fcntl(2)
realisiert, ist auf den meisten UNIX-Systemen vorhanden.
ANMERKUNGEN¶
flock() sperrt keine Datein über NFS. Benutzen Sie stattdessen
fcntl(2). Das funktioniert auch über NFS, wenn eine hinreichend
aktuelle Version von Linux installiert ist und der Server Sperren
unterstützt.
Seit Kernel 2.0 wird
flock() als eigener Systemaufruf realisiert anstatt
in der GNU-C-Bibliothek als Aufruf von
fcntl(2) emuliert zu werden.
Daraus ergibt sich reine BSD-Semantik: Es gibt keine Wechselwirkung zwischen
den Arten von Sperren, die von
flock() und
fcntl (2) angelegt
wurden. Außerdem erkennt
flock() keine Deadlocks.
flock() errichtet nur beratende Sperren, bei geeigneten Berechtigungen
für eine Datei kann ein Prozess den Einsatz von
flock() ignorieren
und E/A auf die Datei durchführen.
Die von
flock() und
fcntl(2) eingerichteten Sperren haben
unterschiedliche Semantik in Bezug auf durch
fork(2) erzeugte Prozesse
und
dup(2). Auf Systemen, die
flock () mit
fcntl(2)
implementieren, wird die Semantik von
flock() anders sein als die in
dieser Handbuchseite beschriebene.
Die Umwandlung einer Sperre (von gemeinsam zu exklusiv oder umgekehrt) ist nicht
garantiert atomar: zuerst wird die bestehende Sperre entfernt und dann eine
neue Sperre errichtet. Zwischen diesen beiden Schritten kann eine anstehende
Sperranforderung von einem anderen Prozess gewährt werden, mit dem
Ergebnis, dass die Umwandlung entweder blockiert oder, wenn
LOCK_NB
angegeben wurde, fehlschlägt. (Dies ist die ursprüngliche
BSD-Verhalten und tritt bei vielen anderen Implementierungen auf.)
SIEHE AUCH¶
close(2),
dup(2),
execve(2),
fcntl(2),
fork(2),
open(2),
lockf(3)
Siehe auch
Documentation/filesystem/locks.txt in den Kernelquellen (
Documentation/locks.txt bei älteren Kerneln).
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler
gemeldet werden können, finden sich unter
http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Dennis Stampfer
<kontakt@dstampfer.de> und Martin Eberhard Schauer
<Martin.E.Schauer@gmx.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public
License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird
KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.