flock(2) System Calls Manual flock(2) BEZEICHNUNG flock - wendet empfohlene Sperren auf eine offene Datei an oder entfernt sie BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include 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 konnen 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 Ahnliches) verwendet, um mehrere Datedeskriptoren fur dieselbe Datei zu erhalten, werden diese Dateideskriptoren von flock() unabhangig behandelt. Ein Versuch, die Datei mit einem dieser Dateideskriptoren zu sperren kann durch eine Sperre verwehrt werden, die der aufrufende Prozess bereits fur einen anderen Dateideskriptor eingerichtet hat. Ein Prozess darf nur einen Typ vor Sperre (gemeinsam oder exklusiv) auf eine Datei halten. Nachfolgende Aufrufe von flock() fur eine bereits gesperrte Datei wird eine bestehende Sperre zum neuen Sperrmodus andern. Von flock() angelegte Sperren bleiben uber einen Aufruf von execve(2) erhalten. Eine Datei kann unabhangig vom Modus, mit dem sie geoffnet wurde, mit einer gemeinsamen oder exklusiven Sperre versehen werden. RUCKGABEWERT Bei Erfolg wird Null zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EBADF dd ist kein Deskriptor fur eine geoffnete Datei. EINTR Wahrend des Wartens auf die Sperre wurde der Aufruf durch ein von einem Handler abgefangenes Signal unterbrochen; siehe signal(7). EINVAL Aktion ist ungultig. ENOLCK Der Kernel hatte keinen Speicher mehr fur das Anlegen von Sperrdatensatzen (lock records). EWOULDBLOCK Die Datei ist gesperrt und der Schalter LOCK_NB wurde gewahlt. 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. Ausserdem 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 uber 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 uber die gesamte Datei emuliert. Ahnlich 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 konnen sich mit dem SMB-Protokoll, den Einhangeoptionen und dem Server-Typ andern. Siehe mount.cifs(8) fur zusatzliche Informationen. STANDARDS BSD. GESCHICHTE 4.4BSD (der Systemaufruf flock() erschien erstmals in 4.2BSD). Eine Version von flock(), moglicherweise 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 uber NFS (d.h. der Gultigkeitsbereich von Sperren beschrankte sich auf das lokale System). Stattdessen konnte fcntl(2) fur Byte-Bereichssperren, die uber NFS funktionieren, verwandt werden, sofern eine ausreichend neue Version von Linux und ein Server, der Sperren unterstutzt, eingesetzt wurden. Seit Linux 2.6.12 unterstutzen NFS-Clients flock(), indem sie sie mit fcntl(2)-Byte-Bereichssperren uber die gesamte Datei emulieren. Das bedeutet, dass fcntl(2)- und flock()-Sperren uber NFS interagieren. Dies bedeutet auch, das zum Setzen einer exklusive Sperre die Datei zum Schreiben geoffnet sein muss. Seit Linux 2.6.37 unterstutzt der Kernel einen Kompatibilitatsmodus, 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 fur eine Datei kann ein Prozess den Einsatz von flock() ignorieren und E/A auf die Datei durchfuhren. 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 gewahrt werden, mit dem Ergebnis, dass die Umwandlung entweder blockiert oder, wenn LOCK_NB angegeben wurde, fehlschlagt. (Dies ist die ursprungliche 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 alteren Kerneln). UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Dennis Stampfer , Martin Eberhard Schauer , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 flock(2)