Man page - dup2(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru ro de

Manual

dup

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
dup2()
dup3()
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
VOIR AUSSI
TRADUCTION

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