Udostępnij za pośrednictwem


_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_errlisti _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 stdoutprogramu , 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.hprogramie ) 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, stdouti i stderrmuszą 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'

Zobacz też

We/Wy niskiego poziomu
_close
_creat, _wcreat
_open, _wopen