FCNTL(2)           Manuel du programmeur Linux           FCNTL(2)


NOM
       fcntl - Manipuler un descripteur de fichier.

SYNOPSIS
       #include <unistd.h>
       #include <fcntl.h>

       int fcntl(int fd, int cmd);
       int fcntl(int fd, int cmd, long arg);
       int fcntl(int fd, int cmd, struct flock * lock);

DESCRIPTION
       La   fonction   fcntl  permet  de  se  livrer  à  diverses
       opérations sur le descripteur de fichier fd.   L'opération
       en question est déterminée par la valeur de l'argument cmd
       :

       F_DUPFD  effectue une copie de fd,  dans  arg  en  fermant
                d'abord arg si besoin est.

                On  peut effectuer la même chose plus aisément en
                utilisant dup2(2).

                Le nouveau descripteur et l'ancien  peuvent  être
                utilises  de  manière interchangeable. Ils parta­
                gent le même verrou, le même position de tête  de
                lecture/écriture,  et  les  mêmes  attributs. Par
                exemple  si  la  tête  de  lecture/écriture   est
                déplacée  en  utilisant  lseek  sur l'un des deux
                descripteurs, la position sera modifiée également
                pour l'autre.

                Les  deux descripteurs ne partagent toutefois pas
                l'attribut       Close-on-exec.        L'attribut
                Close-on-exec de la copie est désactivé.

                En  cas  de  réussite, le nouveau descripteur est
                renvoyé par la fonction fcntl.

       F_GETFD  retourne la valeur de  l'attribut  Close-on-exec.
                Si  le  bit  de  poids  faible  est 0, le fichier
                restera  ouvert  même  au  travers   d'un   exec,
                autrement il sera fermé.

       F_SETFD  positionne   l'attribut   Close-on-Exec  avec  la
                valeur precisée par arg (seul le bit de poids  le
                plus faible est utilisé).


       F_GETFL  retourne  l'ensemble  des  attributs  positionnés
                lors de open(2) pour le descripteur de fichier.

       F_SETFL  fixe de nouveaux attributs pour le descripteur de
                fichier fd.  Les nouveaux attributs sont contenus



Linux                       5 Mai 1999                          1





FCNTL(2)           Manuel du programmeur Linux           FCNTL(2)


                dans arg.  Seuls O_APPEND, O_NONBLOCK et  O_ASYNC
                peuvent être modifiés ainsi, les autres attributs
                ne sont pas affectés.

                A noter, les attributs sont  partagés  entre  les
                différentes  copies  (faites  avec dup(2) etc...)
                d'un même descripteur de fichier.

                Les attributs et leurs sémantiques  sont  décrits
                dans la page de manuel de open(2).

       F_GETLK, F_SETLK, et F_SETLKW
                servent  à  gérer  les verrouillages de fichiers.
                Le troisième argument lock est  un  pointeur  sur
                une  structure  flock  (qui peut être ecrasée par
                l'appel)

       F_GETLK  renvoie  la  structure  flock  qui  nous  empêche
                d'accéder  au  verrou,  ou  positionne  le  champ
                l_type du verrou à la  valeur  F_UNLCK  si  c'est
                possible.

       F_SETLK  active  le  verrou  (si  l_type  vaut  F_RDLCK ou
                F_WRLCK) ou efface  le  verrou  (si  l_type  vaut
                F_UNLCK).   Si  le  verrou est tenu par quelqu'un
                d'autre, cet appel renvoie -1 et positionne errno
                aux valeurs EACCES ou EAGAIN.

       F_SETLKW Comme  F_SETLK, mais attend la libération du ver­
                rou au lieu de retourner une erreur.  Si un  sig­
                nal  à  intercepter  est  reçu  pendant que fcntl
                attend, il est interrompu et renverra  immédiate­
                ment (après retour du gestionnaire de signaux) la
                valeur -1.  errno sera  remplie  avec  la  valeur
                EINTR.

       F_GETOWN,  F_SETOWN, F_GETSIG and F_SETSIG servent à gérer
       la disponibilité des signaux d'entrée/sortie :

       F_GETOWN
              obtient le PID ou l'ID du groupe de  processus  qui
              reçoit   les  signaux  SIGIO  et  SIGURG  pour  les
              évènements concernant le descripteur de fichier fd.
              Les  numéros  de groupes de processus sont renvoyés
              sous forme de valeurs négatives.

       F_SETOWN
              fixe le PID ou l'ID  du  groupe  de  processus  qui
              reçevront  les  signaux  SIGIO  et  SIGURG pour les
              évènements concernant le descripteur.

              Les numéros de groupes de processus  sont  formulés
              en  tant  que  valeurs  négatives.   (F_SETSIG peut
              servir à indiquer un autre signal que SIGIO).



Linux                       5 Mai 1999                          2





FCNTL(2)           Manuel du programmeur Linux           FCNTL(2)


              Si vous fixez l'attribut O_ASYNC sur un descripteur
              de  fichiers  (soit en utilisant ce drapeau lors de
              l'appel à open(2), soit en  utilisant  la  commande
              F_SETFL  de  fcntl), un signal SIGIO est envoyé dès
              que l'entrée ou la sortie  sont  possibles  sur  ce
              descripteur.  Le processus, ou le groupe de proces­
              sus, susceptibles de recevoir le signal  peut  être
              indiqué  avec  la  commande F_SETOWN de la fonction
              fcntl.  Si le descripteur est une socket, ceci per­
              met   également  la  réception  de  signaux  SIGURG
              lorsque des  données  hors-bande  arrivent  sur  la
              socket.  (SIGURG est émis dans toutes les situation
              où l'appel select(2) aurait indiqué que  la  socket
              est  dans  une  "situation exceptionnelle").  Si le
              descripteur de fichier correspond à un terminal, le
              signal  SIGIO  est envoyé au groupe de processus en
              avant-plan sur ce terminal.

       F_GETSIG
              Demande l'émission d'un signal lorsque l'entrée  ou
              la  sortie  deviennent possibles.  Une valeur nulle
              signifie l'émission de SIGIO. Toute autre valeur (y
              compris  SIGIO) précise le signal à émettre, et des
              informations  supplémentaires  seront   disponibles
              pour le gestionnaire de signaux s'il est installé à
              l'aide de SA_SIGINFO.

       F_SETSIG
              Indique le signal à émettre lorsque l'entrée ou  la
              sortie deviennent possibles.  Une valeur nulle sig­
              nifie l'émission de SIGIO. Toute  autre  valeur  (y
              compris  SIGIO) précise le signal à émettre, et des
              informations  supplémentaires  seront   disponibles
              pour le gestionnaire de signaux s'il est installé à
              l'aide de SA_SIGINFO.

              En utilisant F_SETDIG avec une valeur non-nulle, et
              en  configurant  SA_SIGINFO  pour  le  gestionnaire
              (voir sigaction(2)),  des  informations  supplémen­
              taires  sur  les  évènements d'E/S sont fournies au
              gestionnaire à traves une structure siginfo_t.   Si
              le   champ   si_code  indique  que  la  source  est
              SI_SIGIO, le champ si_fd fournit le descripteur  du
              fichier  concerné  par  l'évenement. Sinon il n'y a
              pas d'indication du descripteur en attente,  et  il
              faut  utiliser  le  mécanisme  habituel (select(2),
              poll(2), read(2) avec  O_NONBLOCK  configuré  etc.)
              pour  déterminer quels descripteurs sont dispnibles
              pour les E/S.

              En sélectionnant  un  signal  temps  réel  POSIX.1b
              (valeur >= SIGRTMIN), de multiples évènements d'E/S
              peuvent être mémorisés avec le  même  numéro.   (La
              taille  de la file d'évènement dépend de la mémoire



Linux                       5 Mai 1999                          3





FCNTL(2)           Manuel du programmeur Linux           FCNTL(2)


              libre).  Des  informations   supplémentaires   sont
              disponibles,  comme  ci-dessus,  si  SA_SIGINFO est
              configuré pour le gestionnaire.

       En utilisant ces mécanismes, un programme peut implémenter
       des  E/S  totalement asynchrones, la plupart du temps sans
       avoir besoin d'invoquer select(2) ou poll(2).

       L'utilisation de O_ASYNC, F_GETOWN, est spécifique BSD  et
       Linux.

       F_GETSIG  et F_SETSIG sont spécifiques à Linux. POSIX dis­
       posent d'E/S asynchrones et de la  structure  aio_sigevent
       pour   effectuer   la   même  chose.  Ceci  est  également
       disponible sous Linux dans la bibliothèque GNU C  (Glibc).


VALEUR RENVOYÉE
       La  valeur  renvoyée  par  fcntl  varie  suivant  le  type
       d'opération :

       F_DUPFD  renvoie le nouveau descripteur.

       F_GETFD  renvoie l'état de l'attribut.

       F_GETFL  renvoie l'état des attributs.

       F_GETOWN renvoie le propriétaire du fichier.

       F_GETSIG Valeur du signal envoyé  lorsque  la  lecture  ou
                l'écriture  deviennent possibles, ou zéro pour le
                comportement SIGIO traditionnel.

       En cas d'échec -1 est renvoyé, auquel cas  errno  contient
       le code d'erreur.

ERREURS
       EACCESS  L'opération  est  rendue  impossible à cause d'un
                verrou maintenu par un autre processus.

       EAGAIN   L'opération est rendue impossible à  cause  d'une
                projection en mémoire effectuée par un autre pro­
                cessus.

       EBADF    fs n'est pas un descripteur de fichier ouvert.

       EDEADLK  Le  verrouillage  en  écriture  conduirait  à  un
                blocage.

       EFAULT   lock se trouve en dehors de l'espace d'adressage.

       EINTR    Pour F_SETLKW, la commande a été interrompue  par
                un  signal.  Pour F_GETLK et F_SETLK, la commande
                a  été  interrompue  par  uin  signal  avant   la



Linux                       5 Mai 1999                          4





FCNTL(2)           Manuel du programmeur Linux           FCNTL(2)


                vérification  ou l'acquisition du verrou. Se pro­
                duit surtout lors d'un verrouillage distant  (par
                exemple  à  travers  NFS),  mais  peut  également
                arriver localement.

       EINVAL   Pour F_DUPFD, arg est  soit  négatif,  soit  trop
                grand.  Pour F_SETSIG, arg n'est pas un numéro de
                signal correct.

       EMFILE   Pour F_DUPFD, le processus a déjà ouvert le  nom­
                bre maximal de descripteurs de fichiers.

       ENOLCK   La table des verrous est pleine.

       EPERM    Essai  d'effacement de l'attribut O_APPEND sur un
                fichier, mais il est  considéré  comme  en-ajout-
                seulement.

NOTES
       Les  erreurs  renvoyées par dup2 ne sont pas les mêmes que
       celles renvoyées par fcntl avec la commande F_DUPFD.

CONFORMITÉ
       SVr4, SVID, POSIX, X/OPEN, BSD 4.3. Seules les  opérations
       F_DUPFD,  F_GETFD,  F_SETFD,  F_GETFL,  F_SETFL,  F_GETLK,
       F_SETLK et F_SETLKW sont spécifiées dans POSIX.1. F_GETOWN
       et  F_SETOWN  sont  des  BSDismes  non supportés par SVr4.
       F_GETSIG  et  F_SETSIG  sont  spécifiques  à  Linux.   Les
       attributs  autorisés  pour  F_GETFL/F_SETFL sont ceux sup­
       portés par open(2) et peuvent être différents suivant  les
       systèmes.   O_APPEND, O_NONBLOCK, O_RDONLY, et O_RDWR sont
       spécifies par  POSIX.1.   SVr4  propose  plusieurs  autres
       options et attributs non documentés ici.

       SVr4   indique  des  erreurs  EIO,  ENOLINK  et  EOVERFLOW
       supplémentaires.

VOIR AUSSI
       dup2(2), open(2), socket(2), flock(2)


TRADUCTION
       Christophe Blaess, 1997.














Linux                       5 Mai 1999                          5