Provided by: manpages-fr-dev_4.13-4_all bug

NOM

       flock - Placer ou enlever un verrou coopératif sur un fichier ouvert

SYNOPSIS

       #include <sys/file.h>

       int flock(int fd, int operation);

DESCRIPTION

       Placer  ou enlever 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 à un moment donné.

           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 qu’une requête soit non‐bloquante, il faut inclure LOCK_NB (par un OU binaire « | » )
       avec n’importe quelle opération ci-dessus.

       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 (consultez open(2)). 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é en utilisant un des ces  descripteurs  de
       fichier.  De  plus,  un  verrou  est  relâché par une opération explicite LOCK_UN sur l'un
       quelconque de ces descripteurs de fichier, ou lorsqu'ils ont tous été fermés.

       Si un processus utilise open(2) (ou  équivalent)  pour  avoir  plus  d'un  descripteur  de
       fichier  pour un même fichier, ces descripteurs de fichier 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
       de fichier.

       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és à la fin 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  succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et errno reçoit une
       valeur adéquate.

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 ; consultez signal(7).

       EINVAL operation n’est pas acceptable.

       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É

       4.4BSD  (l'appel  système flock() est apparu dans 4.2BSD). Une version de flock(), parfois
       implémentée à partir de fcntl(2), est apparue sur la plupart des systèmes UNIX.

NOTES

       Depuis le noyau 2.0, flock() est implémenté comme un appel système à part  entière  plutôt
       que  d'être  émulé par une routine de la bibliothèque GNU C invoquant fcntl(2). Avec cette
       implémentation, 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  d’interblocage  (deadlock) (remarquez,
       cependant,  que  sur  certains  BSD  modernes,  les  verrouillages  flock()  et   fcntl(2)
       interagissent entre eux).

       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() sera différente de 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é.  (Cela  est  le  comportement  BSD  d'origine,  et  est partagé par de nombreuses
       implémentations.)

   Détails NFS
       Dans les noyaux Linux supérieurs à 2.6.11,  flock()  ne  verrouille  pas  les  fichiers  à
       travers  NFS  (à  savoir  que  le but des verrous a été limité au système local). Utilisez
       plutôt fcntl(2) pour verrouiller une plage d'octets, qui fonctionne avec NFS si la version
       de Linux est suffisamment récente et si le serveur accepte les verrouillages.

       Depuis  Linux  2.6.12, les clients NFS prennent en charge les verrouillages flock() en les
       émulant sous la forme de verrous de plages d'octets fcntl(2) sur  tout  le  fichier.  Cela
       signifie  que les verrouillages fcntl(2) et flock() interagissent entre eux avec NFS. Cela
       veut dire que pour poser  un  verrouillage  exclusif,  le  fichier  doit  être  ouvert  en
       écriture.

       Depuis  Linux  2.6.37, le noyau gère un mode de compatibilité qui permet aux verrouillages
       flock() (et aux verrous d'une plage d'octets fcntl(2)) d'être traités en local ;  voir  le
       point sur l'option local_lock dans nfs(5).

VOIR AUSSI

       flock(1), close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3), lslocks(8)

       Documentation/filesystems/locks.txt     dans     les     sources     du     noyau    Linux
       (Documentation/locks.txt pour les anciens noyaux)

COLOPHON

       Cette page fait partie de la publication 5.10 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

       La traduction française de cette  page  de  manuel  a  été  créée  par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>, Thierry
       Vignaud <tvignaud@mandriva.com>, François Micaux, Alain  Portal  <aportal@univ-montp2.fr>,
       Jean-Philippe    Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-
       luc.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,  Denis
       Barbier  <barbier@debian.org>,  David  Prévot <david@tilapin.org> et Jean-Philippe MENGUAL
       <jpmengual@debian.org>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à debian-l10n-french@lists.debian.org ⟨⟩.