Loading

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