_dup, _dup2

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Crea un segundo descriptor de archivo para un archivo abierto (_dup), o reasigna un descriptor de archivo (_dup2).

int _dup(   
   int fd   
);  
int _dup2(   
   int fd1,  
   int fd2   
);  

Parámetros

fd, fd1
Descriptores de archivo que hacen referencia al archivo abierto.

fd2
Cualquier descriptor de archivo.

_dup devuelve un descriptor de archivo nuevo. _dup2 devuelve 0 para indicar que la operación ha sido correcta. Si se produce un error, cada función devuelve –1 y establece errno en EBADF si el descriptor de archivo no es válido o en EMFILE si no hay más descriptores de archivo disponibles. En el caso de un descriptor de archivo no válido, la función también invoca el controlador de parámetros no válidos, como se describe en validación del parámetro.

Para obtener más información sobre estos y otros códigos de retorno, vea _doserrno, errno, _sys_errlist y _sys_nerr.

Las funciones _dup y _dup2 asocian un segundo descriptor de archivo a un archivo abierto actualmente. Estas funciones se pueden usar para asociar un descriptor de archivo predefinido, como el de stdout, a otro archivo. Las operaciones en el archivo se pueden realizar con cualquiera de los dos descriptores de archivo. El tipo de acceso permitido al archivo no se ve afectado por la creación de un nuevo descriptor. _dup devuelve el siguiente descriptor de archivo disponible para el archivo especificado. _dup2 obliga a fd2 a hacer referencia al mismo archivo que fd1. Si fd2 se asocia a un archivo abierto en el momento de la llamada, dicho archivo se cierra.

_dup y _dup2 aceptan descriptores de archivo como parámetros. Para pasar un flujo (FILE *) a cualquiera de estas funciones, use _fileno. La rutina de fileno devuelve el descriptor de archivo asociado actualmente al flujo especificado. En el ejemplo siguiente se muestra cómo asociar stderr (definido como FILE * en Stdio.h) con un descriptor de archivo:

int cstderr = _dup( _fileno( stderr ));  

RutinaEncabezado necesario
_dup<io.h>
_dup2<io.h>

La consola no se admite en las aplicaciones de Tienda Windows 8.x. Se deben redirigir los identificadores estándar de flujo que están asociados a la consola, stdin, stdout y stderr, antes de que las funciones en tiempo de ejecución de C puedan usarlos en aplicaciones de Tienda Windows 8.x. Para obtener más información sobre compatibilidad, vea Compatibility.

// 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'  

Salidas de bajo nivel
_Close
_creat, _wcreat
_open, _wopen

Mostrar: