_dup, _dup2
Tworzy deskryptor drugiego pliku dla otwartego pliku (_dup) lub ponownie przypisuje deskryptor pliku (_dup2).
int _dup(
int fd
);
int _dup2(
int fd1,
int fd2
);
Parametry
fd, fd1
Deskryptory pliku odnoszące się do otwarcia pliku.fd2
Każdy deskryptor pliku.
Wartość zwracana
_dup zwraca nowy deskryptor pliku._dup2 zwraca wartość 0, aby wskazać sukces.Jeśli wystąpi błąd, każda funkcja zwraca -1 i ustawia errno jako EBADF jeżeli deskryptor pliku jest nieprawidłowy lub jako EMFILE jeśli więcej deskryptorów plików nie jest dostępnych.W przypadku nieprawidłowego deskryptora pliku, funkcja również wywołuje procedurę obsługi nieprawidłowego parametru, zgodnie z opisem w Sprawdzanie poprawności parametru.
Aby uzyskać więcej informacji na temat tych i innych kodów zwrotu, zobacz _doserrno, errno, _sys_errlist, and _sys_nerr.
Uwagi
_dup i _dup2 funkcje kojarzą deskryptor drugiego pliku z aktualnie otwartym plikiem.Funkcje te można skojarzyć ze wstępnie zdefiniowanym deskryptorem pliku, takim jak stdout, z innego pliku.Operacje na pliku mogą odbywać się przy użyciu pliku albo deskryptora pliku.Typ dostępu przyznany dla pliku nie jest zależny od utworzenia nowego deskryptora._dup zwraca następny dostępny deskryptor pliku dla danego pliku._dup2 wymusza fd2 do odwoływania się do tego samego pliku jako fd1.Jeśli fd2 jest skojarzony z plikiem otwartym w momencie wywołania, ten plik jest zamknięty.
Obie _dup i _dup2 akceptują deskryptory jako parametry.Aby przekazać strumień (FILE *) do jednej z tych funkcji, użyj _fileno.fileno rutynowe zwroty deskryptora pliku aktualnie skojarzone z danym strumieniem.Poniższy przykład pokazuje, jak skojarzyć stderr (zdefiniowana jako FILE* w Stdio.h) z deskryptorem pliku:
int cstderr = _dup( _fileno( stderr ));
Wymagania
Procedura |
Wymagany nagłówek |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
Konsola nie jest obsługiwana w aplikacjach Windows Store.Standardowe uchwyty strumienia powiązane z konsolą—stdin, stdout, i stderr—muszą zostać przekierowane zanim będą wykorzystane przez funkcje środowiska uruchomieniowego C w aplikacjach Windows Store.Aby uzyskać więcej informacji na temat 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" );
}