_dup, _dup2
Criar um segundo descritor de arquivo para um arquivo em aberto (_dup), ou reatribuir um (descritor de arquivo_dup2).
int _dup(
int fd
);
int _dup2(
int fd1,
int fd2
);
Parâmetros
fd, fd1
Referindo-se a em em aberto o arquivo de descritores de arquivo.fd2
Nenhum descritor de arquivo.
Valor de retorno
_dup Retorna um novo descritor de arquivo. _dup2 Retorna 0 para indicar êxito. Se ocorrer um erro, cada função retorna – 1 e define errno para EBADF Se o descritor de arquivo é inválido ou para EMFILE Se não há mais descritores de arquivo disponível. No caso de um descritor de arquivo inválido, a função também chama o manipulador de parâmetro inválido, conforme 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
The _dup e _dup2 funções de associar um segundo descritor de arquivo com um arquivo em aberto no momento. Essas funções podem ser usadas para associar um descritor de arquivo predefinido, sistema autônomo sistema autônomo que stdout, com um arquivo diferente. Operações no arquivo podem ser realizadas usando um descritor de arquivo.O tipo de acesso permitido para o arquivo é afetado pela criação de um novo descritor._dup Retorna o descritor de arquivo disponível próximo de determinado arquivo. _dup2 força fd2 para referir-se o mesmo arquivo sistema autônomo fd1. If fd2 está associado com um arquivo em aberto no momento da telefonar, esse arquivo é fechado.
Ambos sistema autônomo _dup e _dup2 Aceite descritores de arquivo sistema autônomo parâmetros. To pass a stream (FILE *) to either of these functions, use _fileno.The fileno rotina retorna o descritor de arquivo associado ao fluxo determinado no momento. The following example shows how to associate stderr (defined as FILE * in Stdio.h) with a file descriptor:
int cstderr = _dup( _fileno( stderr ));
Requisitos
Rotina |
Cabeçalho necessário |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
Para obter mais informações de compatibilidade, consulte 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" );
}
This goes to stdout first This goes to stdout The file 'data' contains: This goes to file 'data'