_dup, _dup2
Crée un deuxième descripteur de fichier pour un fichier ouvert (_dup), ou réaffecte un descripteur de fichier (_dup2).
int _dup(
int fd
);
int _dup2(
int fd1,
int fd2
);
Paramètres
fd, fd1
Descripteurs de fichier faisant référence au fichier ouvert.fd2
Tout descripteur de fichier.
Valeur de retour
_dup retourne un descripteur de fichier. _dup2 retourne 0 pour indiquer le succès. Si une erreur se produit, chaque fonction retourne – 1 et affecte à errno la valeur EBADF si le descripteur de fichier est invalide ou la valeur EMFILE si aucun descripteur de fichier n'est disponible. Dans le cas d'un descripteur de fichier invalide, la fonction appelle également le gestionnaire de paramètre non valide, comme décrit dans Validation de paramètre.
Pour plus d'informations sur ces codes de retour et autres, consultez _doserrno, errno, _sys_errlist et _sys_nerr.
Notes
Les fonctions _dup et _dup2 associent un deuxième descripteur de fichier avec un fichier ouvert à l'heure actuelle. Ces fonctions peuvent être utilisées pour associer un descripteur de fichier prédéfini, tels que ceux pour stdout, avec un autre fichier. Les opérations sur le fichier peuvent être exécutées à l'aide de l'un ou l'autre des descripteurs de fichier. Le type d'accès autorisé pour le fichier n'est pas affecté par la création d'un nouveau descripteur. _dup retourne le descripteur de fichier disponible suivant pour le fichier donné. _dup2 forces fd2 font 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 tous les deux des descripteurs de fichier comme paramètres. Pour passer un flux (FILE *) à l'une ou l'autre de ces fonctions, utilisez _fileno. La routine fileno retourne le descripteur de fichier actuellement associé au flux donné. L'exemple suivant indique comment associer stderr (défini comme FILE * dans Stdio.h) avec un descripteur de fichier :
int cstderr = _dup( _fileno( stderr ));
Configuration requise
Routine |
En-tête requis |
---|---|
_dup |
<io.h,> |
_dup2 |
<io.h,> |
La console n'est pas prise en charge dans les applications Windows Store . Les handles de flux standard associés à la console, stdin, stdout et stderr doivent être redirigés pour que les fonctions runtime C puissent les utiliser dans les applications Windows Store . Pour plus d'informations sur la compatibilité, consultez Compatibilité.
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" );
}