_dup
, _dup2
Crée un second descripteur de fichier pour un fichier ouvert (_dup
), ou réaffecte un descripteur de fichier (_dup2
).
Syntaxe
int _dup( int fd );
int _dup2( int fd1, int fd2 );
Paramètres
fd
, fd1
Descripteurs de fichier qui font référence à un fichier ouvert.
fd2
Un descripteur de fichier.
Valeur retournée
_dup
retourne un nouveau descripteur de fichier. _dup2
retourne la valeur 0 en cas de réussite. Si une erreur se produit, chaque fonction retourne -1 et la définit errno
EBADF
si le descripteur de fichier n’est pas valide ou si EMFILE
aucun descripteur de fichier n’est plus disponible. Lorsqu’elle a passé un descripteur de fichier non valide, la fonction appelle également le gestionnaire de paramètres non valide, comme décrit dans la validation des paramètres.
Pour plus d’informations sur les codes de retour, consultez , , _sys_errlist
_doserrno
et _sys_nerr
.errno
Notes
Les fonctions _dup
et _dup2
associent un second descripteur de fichier à un fichier ouvert. Ces fonctions peuvent être utilisées pour associer un descripteur de fichier prédéfini, par exemple celui pour stdout
, à un autre fichier. Les opérations sur le fichier peuvent être effectuées à l’aide de l’un des descripteurs de fichier. Le type d’accès autorisé pour le fichier n’est pas affecté par la création d’un descripteur. _dup
retourne le descripteur de fichier disponible suivant pour le fichier donné. _dup2
force fd2
à faire référence au même fichier que fd1
. Si fd2
est associé à un fichier ouvert au moment de l’appel, ce fichier est fermé.
_dup
et _dup2
acceptent des descripteurs de fichiers en tant que paramètres. Pour passer un flux (FILE *
) à l’une de ces fonctions, utilisez _fileno
. La routine fileno
retourne le descripteur de fichier associé au flux donné. L’exemple suivant montre comment associer stderr
(défini comme FILE *
dans stdio.h
) à un descripteur de fichier :
int cstderr = _dup( _fileno( stderr ));
Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.
Spécifications
Routine | En-tête requis |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
La console n’est pas prise en charge dans les applications de la plateforme Windows universelle (UWP). Les handles de flux standard associés à la console (stdin
, stdout
et stderr
) doivent être redirigés pour que les fonctions de runtime C puissent les utiliser dans les applications UWP. Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// crt_dup.c
// This program uses the variable old to save
// the original stdout. It then opens a new file named
// DataFile and forces stdout to refer to it. Finally, it
// restores stdout to its original state.
#include <io.h>
#include <stdlib.h>
#include <stdio.h>
int main( void )
{
int old;
FILE *DataFile;
old = _dup( 1 ); // "old" now refers to "stdout"
// Note: file descriptor 1 == "stdout"
if( old == -1 )
{
perror( "_dup( 1 ) failure" );
exit( 1 );
}
_write( old, "This goes to stdout first\n", 26 );
if( fopen_s( &DataFile, "data", "w" ) != 0 )
{
puts( "Can't open file 'data'\n" );
exit( 1 );
}
// stdout now refers to file "data"
if( -1 == _dup2( _fileno( DataFile ), 1 ) )
{
perror( "Can't _dup2 stdout" );
exit( 1 );
}
puts( "This goes to file 'data'\n" );
// Flush stdout stream buffer so it goes to correct file
fflush( stdout );
fclose( DataFile );
// Restore original stdout
_dup2( old, 1 );
puts( "This goes to stdout\n" );
puts( "The file 'data' contains:" );
_flushall();
system( "type data" );
}
This goes to stdout first
This goes to stdout
The file 'data' contains:
This goes to file 'data'