Partager via


_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" );
}
  

Voir aussi

Référence

E/S niveau bas

_close

_creat, _wcreat

_open, _wopen