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