flock(2) 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 (siehe open(2)). 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 Dateideskriptoren modifiziert oder freigegeben werden. Weiterhin wird die Sperre entweder durch eine explizite LOCK_UN-Operation auf jedem dieser doppelten Dateideskriptoren freigegeben oder wenn alle derartigen Dateideskriptoren geschlossen wurden.

Falls ein Prozess open(2) (oder etwas Ähnliches) verwendet um mehrere Datedeskriptoren für dieselbe Datei zu erhalten, werden diese Dateideskriptoren 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 Dateideskriptor 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.

KONFORM ZU

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

Seit Kernel 2.0 wird flock() als eigener Systemaufruf realisiert anstatt in der GNU-C-Bibliothek als Aufruf von fcntl(2) emuliert zu werden. Es gibt keine Wechselwirkung zwischen den Arten von Sperren, die von flock() und fcntl(2) angelegt wurden. Außerdem erkennt flock() keine Deadlocks. (Beachten Sie, dass auf einigen modernen BSD-Systemen durch flock() und fcntl(2) erzeugte Sperren miteinander interagieren.)

In Linux-Kerneln bis 2.6.11 sperrt flock() keine Dateien über NFS (das bedeutet, der Sperrbereich beschränkt sich auf das lokale System). Stattdessen können Sie die byteweise Sperrung von fcntl(2) verwenden, die auch über NFS funktioniert. Vorausgesetzt wird dabei eine ausreichend aktuelle Version von Linux und ein Server, der Sperrungen unterstützt. Seit Linux 2.6.12 unterstützen NFS-Clients Sperrungen durch flock(), indem sie diese als byteweise Sperrungen der gesamten Datei emulieren. Das bedeutet, dass Sperrungen durch fcntl(2) und flock() über NFS miteinander interagieren. Seit Linux 2.6.37 unterstützt der Kernel einen Kompatibilitätsmodus, der ermöglicht, dass Sperrungen durch flock() (und auch byteweise Sperrungen durch fcntl(2)) als lokal aufgefasst werden; siehe die Erläuterungen zur Option local_lock in nfs(5).

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.)

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Dennis Stampfer <[email protected]>, Martin Eberhard Schauer <[email protected]> und Mario Blättermann <[email protected]> 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 <[email protected]>.