dup(2) System Calls Manual dup(2) NOM dup, dup2, dup3 - Dupliquer un descripteur de fichier BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int dup(int oldfd); int dup2(int oldfd, int newfd); #define _GNU_SOURCE /* See feature_test_macros(7) */ #include /* Definition des constantes O_* */ #include int dup3(int oldfd, int newfd, int flags); DESCRIPTION L'appel systeme dup() affecte un nouveau descripteur de fichier qui se rapporte a la meme description de fichier ouvert que le descripteur oldfd (pour une explication sur les descriptions de fichier ouvert, voir open(2)). Le numero du nouveau descripteur de fichier est garanti d'etre le plus petit qui n'est pas utilise par le processus appelant. Apres un appel reussi, l'ancien et le nouveau descripteur peuvent etre utilises de maniere interchangeable. Ils referencent la meme description de fichier et ainsi partagent les pointeurs de position et les drapeaux. Par exemple, si le pointeur de position est modifie en utilisant lseek(2) sur l'un des descripteurs, la position est egalement changee 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 desactive. dup2() L'appel systeme dup2() effectue la meme tache que dup(), mais au lieu de prendre le plus petit numero de descripteur de fichier inutilise, il utilise le numero de descripteur passe dans newfd. En d'autres termes, le descripteur de fichier newfd est modifie pour se rapporter a la meme description de fichier ouvert que oldfd. Si le descripteur de fichier newfd etait ouvert, il est ferme avant d'etre reutilise ; la fermeture se passe en silence (c'est-a-dire que les messages d'erreur a la fermeture ne sont pas indiques par dup2()). Les etapes de fermeture et de reutilisation du descripteur de fichier newfd sont effectuees de maniere atomique. Cela est important, parce qu'essayer d'implementer des fonctionnalites equivalentes avec close(2) et dup() entrainerait une situation de competition (<< race condition >>), ou newfd pourrait etre reutilise entre les deux etapes. Une telle reutilisation peut intervenir si le programme principal est interrompu par un gestionnaire de signaux qui alloue un descripteur de fichier, ou parce qu'un processus leger qui s'execute en parallele alloue un descripteur de fichier. Notez les points suivants : - Si oldfd n'est pas un descripteur de fichier valable, alors l'appel echoue et newfd n'est pas ferme. - Si oldfd est un descripteur de fichier valable et newfd a la meme valeur que oldfd, alors dup2() ne fait rien et renvoie newfd. dup3() dup3() est identique a dup2(), a l'exception de : - L'appelant peut forcer l'attribut close-on-exec a etre positionne 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 etre utile. - Si oldfd est egal a newfd, alors dup3() echoue avec l'erreur EINVAL. VALEUR RENVOYEE Ces appels systeme renvoient le nouveau descripteur en cas de succes, ou -1 en cas d'echec, auquel cas errno est positionne pour indiquer l'erreur. ERREURS EBADF oldfd n'est pas un descripteur de fichier ouvert. EBADF newfd est en dehors de la plage autorisee pour des descripteurs de fichier (voir le point sur RLIMIT_NOFILE dans getrlimit(2)). EBUSY (Linux seulement) Cette valeur peut etre renvoyee par dup2() ou dup3() lors d'une concurrence critique avec open(2) et dup(). EINTR L'appel dup2() ou dup3() a ete interrompu par un signal ; consultez signal(7). EINVAL (dup3()) flags contient une valeur incorrecte. EINVAL (dup3()) flags etait egal a newfd. EMFILE La limite du nombre de descripteurs de fichier ouverts par processus a ete 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 renvoyees par dup2() sont differentes de celles retournees par fcntl(..., F_DUPFD, ...) si newfd n'est pas dans les valeurs autorisees. Sur certains systemes, dup2 retourne aussi parfois EINVAL comme F_DUPFD. Si newfd etait ouvert, toute erreur qui aurait ete rapportee au moment de close(2) est perdue. Si cela est d'importance, alors, a 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(), a cause de la condition de concurrence decrite ci-dessus. A la place, un code semblable a celui ci-dessous peut etre utilise : /* Obtenir une copie de 'newfd' qui peut ensuite etre utilisee pour verifier les erreurs de close() ; une erreur EBADF signifie que 'newfd' n'etait pas ouvert. */ tmpfd = dup(newfd); if (tmpfd == -1 && errno != EBADF) { /* Gerer une erreur inattendue de dup(). */ } /* Copier 'oldfd' dans 'newfd' de maniere atomique */ if (dup2(oldfd, newfd) == -1) { /* Handle dup2() error. */ } /* Maintenant, verifier les erreurs de close() sur le fichier originellement designe par 'newfd'. */ if (tmpfd != -1) { if (close(tmpfd) == -1) { /* Gerer les erreurs de close(). */ } } VOIR AUSSI close(2), fcntl(2), open(2), pidfd_getfd(2) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 dup(2)