_dup, _dup2
Tworzenie drugiego deskryptor pliku otwartego pliku (_dup), lub zmiany przypisanych deskryptor pliku (_dup2).
int _dup(
int fd
);
int _dup2(
int fd1,
int fd2
);
Parametry
fd, fd1
Deskryptory odnoszące się do otwarcia pliku.fd2
Dowolny deskryptor.
Wartość zwracana
_dupZwraca nowy deskryptor pliku._dup2Zwraca wartość 0 do wskazania sukcesu.Jeśli wystąpi błąd, każda funkcja zwraca –1 i ustawia errno do EBADF Jeżeli deskryptor pliku jest nieprawidłowa lub na EMFILE Jeśli nie więcej deskryptorów plików są dostępne.W przypadku deskryptora nieprawidłowy plik funkcję również wywołuje program nieprawidłowy parametr obsługi, zgodnie z opisem w Sprawdzanie poprawności parametru.
Aby uzyskać więcej informacji na temat tych i innych kody powrotne, zobacz _doserrno, errno, _sys_errlist i _sys_nerr.
Uwagi
_dup i _dup2 funkcje skojarzyć deskryptor drugiego pliku z aktualnie otwartego pliku.Tych funkcji można użyć w celu skojarzenia deskryptor pliku wstępnie zdefiniowanych, takich jak za stdout, z innego pliku.Operacji na pliku może odbywać się przy użyciu albo deskryptor pliku.Typ dostępu przyznany dla pliku jest utworzenie nowego deskryptora nie ma wpływu._dupZwraca następny deskryptor pliku dostępne dla danego pliku._dup2Wymusza fd2 do odwoływania się do tego samego pliku jako fd1.Jeśli fd2 jest skojarzony z otwartego pliku w trakcie rozmowy, że plik jest zamykany.
Obie _dup i _dup2 przyjmuje deskryptorów jako parametry.Aby przekazać strumienia (FILE *) do jednej z tych funkcji, należy użyć _fileno.fileno Rutynowych zwraca deskryptor pliku, aktualnie skojarzonych z danym strumieniu.Poniższy przykład pokazuje jak skojarzyć stderr (zdefiniowane jako FILE* w Stdio.h) z deskryptorem pliku:
int cstderr = _dup( _fileno( stderr ));
Wymagania
Rozpoczęto wykonywanie procedury |
Wymaganego nagłówka |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
Konsola nie jest obsługiwana w Windows Store aplikacji.Związanych z konsolą, dojścia do strumienia standard stdin, stdout, i stderr, muszą być przeniesione, aby funkcje uruchomieniowej C mogą być użyte w Windows Store aplikacji.Informacji dotyczących zgodności, zobacz zgodności we wprowadzeniu.
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" );
}