dup

DUP(2)                    Manuel du programmeur Linux                   DUP(2)



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             /* Consultez feature_test_macros(7) */
       #include <fcntl.h>      /* Définitions des constantes O_*   */
       #include <unistd.h>

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

DESCRIPTION
       L'appel système dup() crée une copie du descripteur de fichiers
       oldfd, en prenant le plus petit numéro inutilisé pour le nouveau
       descripteur.

       Après un appel réussie, l'ancien et le nouveau descripteurs peuvent
       être utilisés de manière interchangeable. Ils référencent la même
       description de fichier ouvert (consultez open(2)) 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 ne partagent toutefois pas l'attribut close‐on‐
       exec. L'attribut close‐on‐exec (FD_CLOEXEC ; consultez fcntl(2)) de la
       copie est désactivé, ce qui signifie qu'il ne sera pas fermé lors
       d'un exec().

   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 fichiers
       inutilisé, il utilise le numéro de descripteur passé dans newfd. Si
       le descripteur newfd était préalablement ouvert, il est fermé, sans
       aucun message, avant d'être réutilisé.

       Les étapes de fermeture et de réutilisation du descripteur de
       fichiers 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 fichiers, ou parce qu'un
       processus léger qui s'exécute en parallèle alloue un descripteur de
       fichiers.

       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 contient le code d'erreur.

ERREURS
       EBADF  oldfd n'est pas un descripteur de fichier ouvert, ou newfd n'est
              pas dans les valeurs autorisées pour un descripteur.

       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. Ou oldfd était
              égal à newfd.

       EMFILE Le processus dispose déjà du nombre maximal de descripteurs de
              fichier autorisés simultanément, et tente d'en ouvrir un
              nouveau.

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() : SVr4, BSD 4.3, POSIX.1-2001.

       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
       descripteur de fichiers dans des gestionnaures 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) {
               /* Gérer une erreur de dup2() */
           }

           /* 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)

COLOPHON
       Cette page fait partie de la publication 3.70 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
       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
       <http://po4a.alioth.debian.org/> par l'équipe de traduction
       francophone au sein du projet perkamon
       <http://perkamon.alioth.debian.org/>.

       Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain
       Portal <http://manpagesfr.free.fr/> (2003-2006).  Julien Cristau et
       l'équipe francophone de traduction de Debian (2006-2009).

       Veuillez signaler toute erreur de traduction en écrivant Ã
       <perkamon-fr@traduc.org>.

       Vous pouvez toujours avoir accès à la version anglaise de ce document
       en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».



Linux                           8 juillet 2014                          DUP(2)