_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_doserrnoet _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'

Voir aussi

E/S de bas niveau
_close
_creat, _wcreat
_open, _wopen