Provided by: manpages-de-dev_4.27.0-1_all 

BEZEICHNUNG
flock - wendet empfohlene Sperren auf eine offene Datei an oder entfernt sie
BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)
ÜBERSICHT
#include <sys/file.h>
int flock(int dd, int Aktion);
BESCHREIBUNG
Wendet empfohlene Sperren auf eine offene, durch dd angegebene Datei an oder entfernt sie. Das Argument
Aktion 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 Aktionen.
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-Aktion 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 gesetzt, um den
Fehler anzuzeigen.
FEHLER
EBADF dd 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 Aktion 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.
VERSIONEN
Seit Linux 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.)
CIFS-Details
In Linux bis 5.4 wird flock() nicht über SMB weitergeleitet. Eine Datei mit solchen Sperren wird auf
fernen Clients nicht gesperrt erscheinen.
Seit Linux 5.5 werden flock()-Sperren mit SMB-Byte-Bereichssperren über die gesamte Datei emuliert.
Ähnlich wie bei NFS bedeutet dies, dass fcntl(2)- und flock()-Sperren miteinander wechselwirken. Eine
anderer wichtiger Seiteneffekt ist, dass die Sperren nicht mehr empfohlene sind: jede E/A auf einer
gesperrten Datei wird immer mit EACCES fehlschlagen, wenn sie von einem separaten Dateideskriptor aus
erfolgt. Dieser Unterschied stammt von dem Design der Sperren in dem SMB-Protokoll, das die Semantik
verpflichtender Sperren bereitstellt.
Die Semantik ferner und verpflichtender Sperren können sich mit dem SMB-Protokoll, den Einhängeoptionen
und dem Server-Typ ändern. Siehe mount.cifs(8) für zusätzliche Informationen.
STANDARDS
BSD.
GESCHICHTE
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.
NFS-Details
In Linux bis 2.6.11 sperrte flock() keine Dateien über NFS (d.h. der Gültigkeitsbereich von Sperren
beschränkte sich auf das lokale System). Stattdessen konnte fcntl(2) für Byte-Bereichssperren, die über
NFS funktionieren, verwandt werden, sofern eine ausreichend neue Version von Linux und ein Server, der
Sperren unterstützt, eingesetzt wurden.
Seit Linux 2.6.12 unterstützen NFS-Clients flock(), indem sie sie mit fcntl(2)-Byte-Bereichssperren über
die gesamte Datei emulieren. Das bedeutet, dass fcntl(2)- und flock()-Sperren über NFS interagieren. Dies
bedeutet auch, das zum Setzen einer exklusive Sperre die Datei zum Schreiben geöffnet sein muss.
Seit Linux 2.6.37 unterstützt der Kernel einen Kompatibilitätsmodus, der flock()-Sperren (und auch
fcntl(2)-Byte-Bereichssperren) als lokal behandelt; siehe die Diskussion der Option local_lock in nfs(5).
ANMERKUNGEN
flock() setzt nur empfehlende 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
flock(1), close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3), lslocks(8)
Documentation/filesystems/locks.txt im Linux-Kernelquellbaum (Documentation/locks.txt bei älteren
Kerneln).
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Dennis Stampfer <kontakt@dstampfer.de>, Martin
Eberhard Schauer <Martin.E.Schauer@gmx.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Helge
Kreutzmann <debian@helgefjell.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 die
Mailingliste der Übersetzer: debian-l10n-german@lists.debian.org.
Linux man-pages 6.9.1 2. Mai 2024 flock(2)