Freigeben über


_dup, _dup2

Erstellen Sie einen zweiten Dateideskriptor für eine geöffnete Datei (_dup), oder weisen Sie einen Dateideskriptor erneut zu _dup2().

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

Parameter

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

  • fd2
    Alle Dateideskriptor.

Rückgabewert

_dup gibt einen neuen Dateideskriptor zurück._dup2 gibt 0 zurück, um Erfolg anzugeben.Wenn ein Fehler auftritt, wird jeder Funktion gibt - 1 und errno zu EBADF fest, wenn der Dateideskriptor oder zu EMFILE ist ungültig, wenn nicht mehr Dateideskriptoren verfügbar sind.Bei einem ungültigen Dateideskriptors ruft die Funktion auch den ungültigen Parameterhandler 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 _dup und _dup2-Funktionen ordnen einen zweiten Dateideskriptor mit einer aktuell geöffneten Datei zu.Diese Funktionen können verwendet werden, um vordefinierten Dateideskriptor, wie die für stdout, mit einer anderen Datei zuzuordnen.Arbeiten auf der Datei können mit den einzelnen Dateideskriptors durchgeführt werden.Der Typ des Zugriffs zulässig für die Datei wurde durch die 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 dieselbe Datei wie fd1 zuzugreifen.Wenn fd2 mit einer geöffneten Datei zum Zeitpunkt des Aufrufs zugeordnet ist, wird diese Datei geschlossen.

_dup akzeptieren und _dup2 Dateideskriptoren als Parameter.Um einen Stream (FILE *) zu einer dieser Funktionen führen, verwenden Sie _fileno.Die fileno Routine gibt den Dateideskriptor zurück, der nur mit dem angegebenen Stream zugeordnet ist.Im folgenden Beispiel wird gezeigt, wie stderr (definiert als FILE* in Stdio.h) mit einem Dateideskriptor zuordnet:

int cstderr = _dup( _fileno( stderr ));

Anforderungen

Routine

Erforderlicher Header

_dup

<io.h>

_dup2

<io.h>

Die Konsole wird nicht in Windows Store-App unterstützt.Die Standardstreamhandles, die mit der Konsole, stdin, stdout und stderr zugeordnet werden, müssen umgeleitet werden, bevor sie C-Laufzeitfunktionen in Windows Store-App verwenden können.Weitere Kompatibilitätsinformation finden Sie unter Kompatibilität in der Einführung.

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

_create, _wcreat

_open, _wopen