_dup, _dup2
Crie um segundo arquivo descritor para um arquivo aberto_dup(), ou um atributo novamente um arquivo descritor (_dup2).
int _dup( int fd ); int _dup2( int fd1, int fd2 );
Parâmetros
fd, fd1
Descritores de Arquivo que fazem referência ao arquivo aberto.fd2
Qualquer arquivo descritor.
Valor de retorno
_dup retorna um descritor de novo arquivo._dup2 retorna 0 para indicar o êxito.Se ocorrer um erro, os retornos de cada função – 1 e definem errno a EBADF se o arquivo descritor é inválido ou não mais se a EMFILE arquivo descritor está disponível.No caso de um arquivo descritor inválida, a função também chama o manipulador de parâmetro inválido, como descrito em Validação de parâmetro.
Para obter mais informações sobre esses e outros códigos de retorno, consulte _doserrno, errno, _sys_errlist, e _sys_nerr.
Comentários
Funções de _dup e de _dup2 associam um segundo arquivo descritor com um arquivo aberto.Essas funções podem ser usadas para associar um arquivo descritor predefinido, como o para stdout, com um arquivo diferente.Operações no arquivo podem ser executadas usando um ou outro arquivo descritor.O tipo de acesso permitido o arquivo é afetado pela criação de um novo descritor._dup retorna o arquivo descritor disponível a seguir para o arquivo especificado._dup2 força fd2 para se referir ao mesmo arquivo que fd1.Se fd2 está associado a um arquivo aberto no momento de chamada, esse arquivo está fechado.
_dup e _dup2 aceitam descritores de arquivo como parâmetros.Para passar um fluxo (FILE *) *)a qualquer uma dessas funções, use _fileno.A rotina de fileno retorna o arquivo descritor associado com o momento determinado fluxo.O exemplo a seguir mostra como associar stderr (definido como FILE* em Stdio.h) com um arquivo descritor:
int cstderr = _dup( _fileno( stderr ));
Requisitos
Rotina |
Cabeçalho necessário |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
O console não é suportado em aplicativos de Windows Store .Identificadores padrões de fluxo associadas ao console, stdin, stdout, e stderr, devem ser redirecionada antes que as funções de tempo de execução das C pode usar em aplicativos de Windows Store .Para mais informações, consulte Compatibilidade de compatibilidade na introdução.
Exemplo
// 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" );
}