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 /* Consultez feature_test_macros(7) */ #include <fcntl.h> /* Obtenir les définition de constante O_* */ #include <unistd.h>
int dup3(int oldfd, int newfd, int flags);
L'appel système dup() crée une copie du descripteur de fichier oldfd, en prenant le plus petit numéro inutilisé pour le nouveau descripteur.
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 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 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é.
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. 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 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 :
dup3() est identique à dup2(), à l'exception de :
Ces appels système renvoient le nouveau descripteur en cas de succès, ou -1 en cas d'échec, auquel cas errno est positionné correctement.
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) {
/* 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() */
} }
Cette page fait partie de la publication 5.10 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.
1 novembre 2020 | Linux |