Sdílet prostřednictvím


_dup, _dup2

Vytvoří druhý popisovač souboru pro otevřený soubor (_dup) nebo znovu přiřazuje popisovač souboru (_dup2).

Syntaxe

int _dup( int fd );
int _dup2( int fd1, int fd2 );

Parametry

fd, fd1
Popisovače souborů odkazující na otevřený soubor.

fd2
Jakýkoli popisovač souboru.

Vrácená hodnota

_dup vrátí nový popisovač souboru. _dup2 vrátí hodnotu 0, která značí úspěch. Pokud dojde k chybě, vrátí každá funkce hodnotu -1 a nastaví errno se na EBADF to, zda je popisovač souboru neplatný nebo pokud EMFILE nejsou k dispozici žádné další popisovače souborů. Při předání neplatného popisovače souboru vyvolá funkce také neplatnou obslužnou rutinu parametru, jak je popsáno v ověření parametru.

Další informace o návratových kódech naleznete v tématu errno, _doserrno, _sys_errlista _sys_nerr.

Poznámky

_dup2 Funkce _dup přidružují druhý popisovač souboru k aktuálně otevřenému souboru. Tyto funkce lze použít k přidružení předdefinovaného popisovače souboru, například pro stdout, k jinému souboru. Operace se souborem lze provádět pomocí popisovače souborů. Typ přístupu pro soubor nemá vliv na vytvoření nového popisovače. _dup vrátí další dostupný popisovač souboru pro daný soubor. _dup2 vynutí fd2 odkazovat na stejný soubor jako fd1. Pokud fd2 je přidružený k otevřenému souboru v době volání, tento soubor je zavřený.

Oba _dup a _dup2 přijmout popisovače souborů jako parametry. Pokud chcete předat datový proud (FILE *) některé z těchto funkcí, použijte _fileno. Rutina fileno vrátí popisovač souboru, který je aktuálně přidružený k danému datovému proudu. Následující příklad ukazuje, jak přidružit stderr (definované jako FILE * v stdio.h) k popisovači souboru:

int cstderr = _dup( _fileno( stderr ));

Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.

Požadavky

Rutina Požadovaný hlavičkový soubor
_dup <io.h>
_dup2 <io.h>

Konzola není podporována v aplikacích pro Univerzální platforma Windows (UPW). Standardní zpracování datových proudů, které jsou přidružené ke konzole , a , stderrmusí být přesměrovány před tím, stdinstdoutnež je funkce runtime jazyka C mohou používat v aplikacích pro UPW. Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

// 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'

Viz také

Vstupně-výstupní operace nízké úrovně
_close
_creat, _wcreat
_open, _wopen