Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

       dup, dup2, dup3 - Dupliquer un descripteur de fichier

SYNOPSIS

       #include <unistd.h>

       int dup(int oldfd);
       int dup2(int oldfd, int newfd);

       #define _GNU_SOURCE             /* See feature_test_macros(7) */
       #include <fcntl.h>              /* Definition of O_* constants */
       #include <unistd.h>

       int dup3(int oldfd, int newfd, int flags);

DESCRIPTION

       The  dup()   system call allocates a new file descriptor that refers to the same open file
       description as the descriptor oldfd. (For an explanation of open  file  descriptions,  see
       open(2).)  The  new  file  descriptor  number is guaranteed to be the lowest-numbered file
       descriptor that was unused in the calling process.

       After a successful return, the old and new file descriptors may be  used  interchangeably.
       Since  the  two  file descriptors refer to the same open file description, they share file
       offset and file status flags; for example,  if  the  file  offset  is  modified  by  using
       lseek(2)   on  one  of the file descriptors, the offset is also changed for the other file
       descriptor.

       Les deux descripteurs de fichier ne partagent  pas  les  attributs  (celui  close‐on‐exec.
       L'attribut  close‐on‐exec  (FD_CLOEXEC ; consultez fcntl(2)) pour le descripteur en double
       est désactivé.

   dup2()
       The dup2()  system call performs the  same  task  as  dup(),  but  instead  of  using  the
       lowest-numbered  unused  file  descriptor, it uses the file descriptor number specified in
       newfd. In other words, the file descriptor newfd is adjusted so that it now refers to  the
       same open file description as oldfd.

       If  the  file  descriptor newfd was previously open, it is closed before being reused; the
       close is performed silently (i.e., any  errors  during  the  close  are  not  reported  by
       dup2()).

       Les  étapes  de  fermeture  et  de  réutilisation  du  descripteur  de  fichier newfd sont
       effectuées de manière atomique. Cela est important,  parce  qu'essayer  d'implémenter  des
       fonctionnalités  équivalentes  avec  close(2)  et  dup()  entraînerait  une  situation  de
       compétition (« race condition »), où newfd pourrait être réutilisé entre les deux  étapes.
       Une  telle  réutilisation  peut intervenir si le programme principal est interrompu par un
       gestionnaire de signaux qui alloue un descripteur de fichier,  ou  parce  qu'un  processus
       léger qui s'exécute en parallèle alloue un descripteur de fichier.

       Notez les points suivants :

       –  Si  oldfd  n'est  pas  un descripteur de fichier valable, alors l'appel échoue et newfd
          n'est pas fermé.

       –  Si oldfd est un descripteur de fichier valable et newfd a la  même  valeur  que  oldfd,
          alors dup2() ne fait rien et renvoie newfd.

   dup3()
       dup3() est identique à dup2(), à l'exception de :

       –  L'appelant  peut  forcer  l'attribut  close-on-exec  à  être positionné pour le nouveau
          descripteur de fichier en ajoutant O_CLOEXEC dans flags. Consultez  la  description  de
          cet attribut dans open(2) pour savoir pourquoi cela peut être utile.

       –  Si oldfd est égal à newfd, alors dup3() échoue avec l'erreur EINVAL.

VALEUR RENVOYÉE

       On  success,  these system calls return the new file descriptor. On error, -1 is returned,
       and errno is set to indicate the error.

ERREURS

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

       EBADF  newfd est en dehors de la plage autorisée pour des descripteurs de fichier (voir le
              point sur RLIMIT_NOFILE dans getrlimit(2)).

       EBUSY  (Linux  seulement)  Cette valeur peut être renvoyée par dup2() ou dup3() lors d'une
              concurrence critique avec open(2) et dup().

       EINTR  L'appel dup2() ou dup3() a été interrompu par un signal ; consultez signal(7).

       EINVAL (dup3()) flags contient une valeur incorrecte.

       EINVAL (dup3()) flags était égal à newfd.

       EMFILE La limite du nombre de descripteurs de fichier ouverts par processus a été atteinte
              (voir le point sur RLIMIT_NOFILE dans getrlimit(2)).

VERSIONS

       dup3()  a  été ajouté dans Linux dans la version 2.6.27 ; sa prise en charge dans la glibc
       est disponible à partir de la version 2.9.

CONFORMITÉ

       dup(), dup2() : POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

       dup3() est spécifique à Linux.

NOTES

       Les erreurs renvoyées par dup2() sont différentes  de  celles  retournées  par  fcntl(...,
       F_DUPFD,  ...) si newfd n'est pas dans les valeurs autorisées. Sur certains systèmes, dup2
       retourne aussi parfois EINVAL comme F_DUPFD.

       Si newfd était ouvert, toute erreur qui aurait été rapportée au  moment  de  close(2)  est
       perdue.  Si  cela  est d'importance, alors, à moins que le programme ne soit monothread et
       n'alloue pas de descripteurs de fichier dans  des  gestionnaires  de  signaux,  l'approche
       correcte  est  de  ne  pas fermer newfd avant d'appeler dup2(), à cause de la condition de
       concurrence décrite ci-dessus. À la place, un code semblable à celui ci-dessous peut  être
       utilisé :

           /* Obtenir une copie de 'newfd' qui peut ensuite être
              utilisée pour vérifier les erreurs de close() ; une
              erreur EBADF signifie que 'newfd' n'était pas ouvert. */

           tmpfd = dup(newfd);
           if (tmpfd == -1 && errno != EBADF) {
               /* Handle unexpected dup() error. */
           }

           /* Atomically duplicate 'oldfd' on 'newfd'. */

           if (dup2(oldfd, newfd) == -1) {
               /* Handle dup2() error. */
           }

           /* Now check for close() errors on the file originally
              referred to by 'newfd'. */

           if (tmpfd != -1) {
               if (close(tmpfd) == -1) {
                   /* Handle errors from close. */
               }
           }

VOIR AUSSI

       close(2), fcntl(2), open(2), pidfd_getfd(2)

COLOPHON

       Cette  page  fait partie de la publication 5.13 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⟩.