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

dup, dup2, dup3 - Dupliquer un descripteur de fichier

#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);

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

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

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

oldfd n'est pas un descripteur de fichier ouvert.
newfd est en dehors de la plage autorisée pour des descripteurs de fichier (voir le point sur RLIMIT_NOFILE dans getrlimit(2)).
(Linux seulement) Cette valeur peut être renvoyée par dup2() ou dup3() lors d'une concurrence critique avec open(2) et dup().
L'appel dup2() ou dup3() a été interrompu par un signal ; consultez signal(7).
(dup3()) flags contient une valeur incorrecte.
(dup3()) flags était égal à newfd.
La limite du nombre de descripteurs de fichier ouverts par processus a été atteinte (voir le point sur RLIMIT_NOFILE dans getrlimit(2)).

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.

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

dup3() est spécifique à Linux.

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. */
} }

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

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

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

22 mars 2021 Linux