Compartir a través de


_dup, _dup2

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

Sintaxis

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.

Valor devuelto

_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 en errno EBADF si el descriptor de archivo no es válido o si EMFILE no hay más descriptores de archivo disponibles. Cuando se pasa 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 de parámetros.

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

Comentarios

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 una secuencia (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 ));

De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.

Requisitos

Routine Encabezado necesario
_dup <io.h>
_dup2 <io.h>

La consola no se admite en las aplicaciones de la Plataforma universal de Windows (UWP). Los identificadores de flujo estándar asociados a la consola, stdin, stdout y stderr, se deben redirigir antes de que las funciones en tiempo de ejecución de C puedan usarlos en aplicaciones para UWP. Para obtener más información sobre compatibilidad, consulte Compatibilidad.

Ejemplo

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

Vea también

E/S de bajo nivel
_close
_creat, _wcreat
_open, _wopen