Provided by: manpages-fr-dev_4.23.1-1_all bug

NOM

       dup, dup2, dup3 - Dupliquer un descripteur de fichier

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <unistd.h>

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

       #define _GNU_SOURCE             /* Consultez feature_test_macros(7) */
       #include <fcntl.h>              /* Définition des constantes O_* */
       #include <unistd.h>

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

DESCRIPTION

       L'appel  système dup() affecte un nouveau descripteur de fichier qui se rapporte à la même
       description de fichier ouvert que le descripteur  oldfd  (pour  une  explication  sur  les
       descriptions de fichier ouvert, voir open(2)). Le numéro du nouveau descripteur de fichier
       est garanti d'être le plus petit qui n'est pas utilisé par le processus appelant.

       Après un appel réussi, l'ancien et le nouveau descripteur peuvent être utilisés de manière
       interchangeable.  Ils  référencent  la  même description de fichier et ainsi partagent les
       pointeurs de position et les drapeaux. Par exemple, si le pointeur de position est modifié
       en  utilisant  lseek(2)  sur l'un des descripteurs, la position est également changée pour
       l'autre.

       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()
       L'appel système dup2() effectue la même tâche que dup(), mais au lieu de prendre  le  plus
       petit  numéro  de  descripteur  de  fichier inutilisé, il utilise le numéro de descripteur
       passé dans newfd. En d'autres termes, le descripteur de fichier newfd est modifié pour  se
       rapporter à la même description de fichier ouvert que oldfd.

       Si  le descripteur de fichier newfd était ouvert, il est fermé avant d'être réutilisé ; la
       fermeture se passe en silence (c'est-à-dire que les messages d'erreur à  la  fermeture  ne
       sont pas indiqués par 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

       Ces  appels  système  renvoient  le  nouveau  descripteur  en  cas de succès, ou -1 en cas
       d'échec, auquel cas errno est positionné pour indiquer l'erreur.

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

STANDARDS

       dup()
       dup2() POSIX.1-2008.

       dup3() Linux.

HISTORIQUE

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

       dup3() Linux 2.6.27, glibc 2.9.

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) {
               /* Gérer une erreur inattendue de dup(). */
           }

           /* Copier 'oldfd' dans 'newfd' de manière atomique */

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

           /* Maintenant, vérifier les erreurs de close() sur le fichier
              originellement désigné par 'newfd'. */

           if (tmpfd != -1) {
               if (close(tmpfd) == -1) {
                   /* Gérer les erreurs de close(). */
               }
           }

VOIR AUSSI

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

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