_dup
, _dup2
Tworzy drugi deskryptor plików dla otwartego pliku (_dup
) lub ponownie przypisuje deskryptor plików (_dup2
).
Składnia
int _dup( int fd );
int _dup2( int fd1, int fd2 );
Parametry
fd
, fd1
Deskryptory plików odwołujące się do otwartego pliku.
fd2
Dowolny deskryptor plików.
Wartość zwracana
_dup
Zwraca nowy deskryptor plików. _dup2
Zwraca wartość 0, aby wskazać powodzenie. Jeśli wystąpi błąd, każda funkcja zwraca wartość -1 i ustawia errno
EBADF
wartość , jeśli deskryptor plików jest nieprawidłowy lub EMFILE
jeśli nie są dostępne żadne deskryptory plików. Po przekazaniu nieprawidłowego deskryptora pliku funkcja wywołuje również nieprawidłową procedurę obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów.
Aby uzyskać więcej informacji na temat kodów zwracanych, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Funkcje _dup
i _dup2
kojarzą drugi deskryptor plików z aktualnie otwartym plikiem. Te funkcje mogą służyć do skojarzenia wstępnie zdefiniowanego deskryptora plików, takiego jak dla stdout
programu , z innym plikiem. Operacje na pliku można wykonać przy użyciu deskryptora plików. Typ dostępu dozwolonego dla pliku nie ma wpływu na utworzenie nowego deskryptora. _dup
Zwraca następny dostępny deskryptor pliku dla danego pliku. _dup2
wymusza fd2
odwoływanie się do tego samego pliku co fd1
. Jeśli fd2
plik jest skojarzony z otwartym plikiem w momencie wywołania, ten plik jest zamykany.
Zarówno, _dup
jak i _dup2
akceptują deskryptory plików jako parametry. Aby przekazać strumień (FILE *
) do jednej z tych funkcji, użyj polecenia _fileno
. Rutyna fileno
zwraca deskryptor plików skojarzony obecnie z danym strumieniem. W poniższym przykładzie pokazano, jak skojarzyć stderr
element (zdefiniowany jako FILE *
w stdio.h
programie ) z deskryptorem pliku:
int cstderr = _dup( _fileno( stderr ));
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
Konsola nie jest obsługiwana w aplikacjach platformy platforma uniwersalna systemu Windows (UWP). Standardowe dojścia strumienia skojarzone z konsolą programu stdin
, stdout
i i stderr
muszą zostać przekierowane, zanim funkcje czasu wykonywania języka C będą mogły ich używać w aplikacjach platformy UWP. Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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'