_dup
, _dup2
Erstellt einen zweiten Dateideskriptor für eine geöffnete Datei (_dup
) oder weist einen Dateideskriptor neu zu (_dup2
).
Syntax
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 sie fest errno
, EBADF
wenn der Dateideskriptor ungültig ist oder ob EMFILE
keine weiteren Dateideskriptoren verfügbar sind. Wenn ein ungültiger Dateideskriptor übergeben wird, ruft die Funktion auch den ungültigen Parameterhandler auf, wie in der Parameterüberprüfung beschrieben.
Weitere Informationen zu Rückgabecodes finden Sie unter , , _doserrno
, _sys_errlist
und _sys_nerr
.errno
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 Datenstrom (FILE *
) an eine dieser Funktionen zu übergeben, verwenden Sie _fileno
. Die fileno
-Routine gibt den Dateideskriptor zurück, der derzeit dem angegebenen Stream zugeordnet ist. Im folgenden Beispiel wird gezeigt, wie Sie einen Dateideskriptor (definiert als FILE *
instdio.h
) zuordnen stderr
:
int cstderr = _dup( _fileno( stderr ));
Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Informationen zum Ändern dieses Verhaltens finden Sie im Global state in the CRT.
Anforderungen
Routine | Erforderlicher Header |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
Die Konsole wird in Universelle Windows-Plattform -Apps (UWP) nicht unterstützt. Die Standardstreamhandles, die der Konsole zugeordnet sind, stdin
stdout
und stderr
müssen umgeleitet werden, bevor C-Laufzeitfunktionen sie in UWP-Apps verwenden 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" );
}
This goes to stdout first
This goes to stdout
The file 'data' contains:
This goes to file 'data'
Siehe auch
E/A auf niedriger Ebene
_close
_creat
, _wcreat
_open
, _wopen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für