NOM
flock - Placer ou enlever un verrou coopératif sur un fichier ouvert
SYNOPSIS
#include <sys/file.h>
int flock(int fd, int operation);
Place ou enlève un verrou consultatif sur un fichier ouvert dont le
descripteur est fd. Le paramètre operation est l’un des suivants :
LOCK_SH Verrouillage partagé. Plusieurs processus peuvent disposer
d’un verrouillage partagé simultanément sur un même
fichier.
LOCK_EX Verrouillage exclusif. Un seul processus dispose d’un
verrouillage exclusif sur un fichier, à un moment donné.
LOCK_UN Déverrouillage d’un verrou tenu par le processus.
Un appel flock() peut bloquer si un verrou incompatible est tenu par un
autre processus. Pour que la requête soit non‐bloquante, il faut
inclure LOCK_NB (par un OU binaire « | » ) avec la constante précisant
l’opération.
Un même fichier ne peut pas avoir simultanément des verrous partagés et
exclusifs.
Les verrous créés avec flock() sont associés à un fichier, ou plus
précisément une entrée de la table des fichiers ouverts. Ainsi, les
descripteurs de fichier dupliqués (par exemple avec fork(2) ou dup(2))
réfèrent au même verrou, et celui‐ci peut être relâché ou modifié à
travers n’importe lequel des descripteurs. De plus, un verrou est
relâché par une opération explicite LOCK_UN sur l’un quelconque des
descripteurs, ou lorsqu’ils ont tous été fermés.
Si un processus utilise open(2) (ou équivalent) plusieurs fois pour
obtenir plusieurs descripteurs sur le même fichier, ces descripteurs
sont traités indépendamment par flock(). Une tentative de verrouiller
le fichier avec l’un de ces descripteurs peut être refusée si le
processus appelant a déjà placé un verrou en utilisant un autre
descripteur.
Un processus ne peut avoir qu’un seul type de verrou (partagé ou
exclusif) sur un fichier. En conséquence un appel flock() sur un
fichier déjà verrouillé modifiera le type de verrouillage.
Les verrous créés par flock() sont conservé au travers d’un execve(2).
Un verrou partagé ou exclusif peut être placé sur un fichier quel que
soit le mode d’ouverture du fichier.
VALEUR RENVOYÉE
En cas de réussite, zéro est renvoyé, sinon -1 est renvoyé et errno
contient le code d’erreur.
ERREURS
EBADF fd n’est pas un descripteur de fichier ouvert.
EINTR Durant l’attente pour acquérir le verrou, l’appel a été
interrompu par un signal capturé par un gestionnaire ; voir
signal(7).
EINVAL operation est invalide.
ENOLCK Le noyau n’a pas assez de mémoire pour les allocations de
verrou.
EWOULDBLOCK
Le fichier est verrouillé et l’attribut LOCK_NB a été précisé.
CONFORMITÉ
BSD 4.4 (l’appel système flock() est apparu dans BSD 4.2). Une version
de flock() parfois implémenté à partir de fcntl(2), est apparue sur la
plupart des systèmes Unix.
NOTES
flock() ne verrouille par les fichiers à travers NFS. Utilisez fcntl(2)
à la place : il fonctionne avec NFS si la version de Linux est
suffisamment récente et si le serveur accepte les verrouillages.
Depuis le noyau 2.0, flock() est implémenté par un appel système plutôt
que d’être émulé par une routine de la bibliothèque C invoquant
fcntl(2). Ceci correspond à la véritable sémantique BSD : il n’y a pas
d’interaction entre les verrous placés par flock() et fcntl(2), et
flock() ne détecte pas les cas de blocage (deadlock).
flock() place uniquement des verrous coopératifs : suivant les
permissions du fichier un processus peut ignorer l’utilisation de
flock() et faire des entrées-sorties sur le fichier.
Les sémantiques des verrous placés par flock() et fcntl(2) sont
différentes en ce qui concerne fork(2) et dup(2). Sur les systèmes qui
implémentent flock() en utilisant fcntl(2), la sémantique de flock() ne
sera pas celle décrite ici.
La conversion d’un verrou (de partagé à exclusif et vice versa) n’est
pas toujours atomique : tout d’abord le verrou existant est supprimé,
puis un nouveau verrou est établi. Entre ces deux étapes, un verrou
demandé par un autre processus peut être accordé, ce qui peut causer
soit un blocage de la conversion, soit son échec, si LOCK_NB était
indiqué. (Ceci est le comportement BSD d’origine, et est partagé par de
nombreuses implémentations.)
VOIR AUSSI
close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3)
Voir aussi Documentation/filesystem/locks.txt dans les sources du noyau
(Documentation/locks.txt pour les anciens noyaux).
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».