_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_errlist
a _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 , stderr
musí být přesměrovány před tím, stdin
stdout
než 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