Freigeben über


_dup, _dup2

Erstellt einen zweiten Dateideskriptor für eine geöffnete Datei (_dup) oder weist einen Dateideskriptor neu zu (_dup2).

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

Parameter

  • fd, fd1
    Dateideskriptoren, die auf die geöffnete Datei verweisen.

  • fd2
    Jeder beliebige Dateideskriptor.

Rückgabewert

_dup gibt einen neuen Dateideskriptor zurück. _dup2 gibt bei Erfolg 0 zurück. Wenn ein Fehler auftritt, gibt jede Funktion – 1 zurück und legt bei einem ungültigen Dateideskriptor errno auf EBADF fest oder auf EMFILE, wenn keine weiteren Dateideskriptoren verfügbar sind. Bei einem ungültigen Dateideskriptor ruft die Funktion auch den Handler für ungültige Parameter auf, wie in Parametervalidierung beschrieben.

Weitere Informationen zu diesen und anderen Rückgabecodes finden Sie unter _doserrno, errno, _sys_errlist und _sys_nerr.

Hinweise

Die Funktionen _dup und _dup2 ordnen einen zweiten Dateideskriptor einer momentan geöffneten Datei zu. Diese Funktionen können verwendet werden, um einen vordefinierten Dateideskriptor – wie z. B. stdout – einer anderen Datei zuzuordnen. Das Durchführen von Operationen an der Datei ist mit jedem der beiden Dateideskriptoren möglich. Der für die Datei zulässige Zugriffstyp ist von der Erstellung eines neuen Deskriptors nicht betroffen. _dup gibt den nächsten verfügbaren Dateideskriptor für die angegebene Datei zurück. _dup2 erzwingt fd2, um auf dieselbe Datei wie fd1 zu verweisen. Wenn fd2 zum Zeitpunkt des Aufrufs einer geöffneten Datei zugeordnet ist, wird diese Datei geschlossen.

_dup und _dup2 akzeptieren Dateideskriptoren als Parameter. Um einen Stream (FILE *) an jede dieser Funktionen zu übergeben, verwenden Sie _fileno. Die fileno-Routine gibt den Dateideskriptor zurück, der derzeit dem angegebenen Stream zugeordnet ist. Das folgende Beispiel zeigt, wie stderr (definiert als FILE * in Stdio.h) einem Dateideskriptor zugeordnet wird:

int cstderr = _dup( _fileno( stderr ));

Anforderungen

Routine

Erforderlicher Header

_dup

<io.h>

_dup2

<io.h>

Die Konsole wird in Windows Store-Apps nicht unterstützt. Die mit der Konsole verknüpften Standardstreamhandles, stdin, stdout und stderr, müssen umgeleitet werden, bevor sie von C-Laufzeitfunktionen in Windows Store-Apps verwendet werden können. Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

// 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" );
}
  

Siehe auch

Referenz

E/A auf niedriger Ebene

_close

_creat, _wcreat

_open, _wopen