_dup, _dup2
Creare un secondo descrittore di file per un file aperto (_dup), oppure riassegnare un descrittore del file (_dup2).
int _dup(
int fd
);
int _dup2(
int fd1,
int fd2
);
Parametri
fd, fd1
Descrittori del file che fanno riferimento al file aperto.fd2
Un descrittore del file.
Valore restituito
_dup restituisce un nuovo descrittore del file._dup2 restituisce 0 per indicare la riuscita.Se si verifica un errore, termine di ogni funzione a 1 e imposta errno a EBADF se il descrittore di file non valido o a EMFILE se non esistono descrittori di file disponibili.Nel caso di un descrittore di file non valido, la funzione viene richiamato il gestore non valido di parametro, come descritto in Convalida dei parametri.
Per ulteriori informazioni su questi e altri codici restituiti, vedere _doserrno, errno, _sys_errlist, e _sys_nerr.
Note
Le funzioni di _dup2 e di _dup associano un secondo descrittore di file con un file aperto.Tali funzioni possono essere utilizzate per associare un descrittore di file predefinito, come quella per stdout, con un file diverso.Le operazioni su file può essere eseguito utilizzando qualsiasi descrittore del file.Il tipo di accesso consentito per il file non viene influenzato dalla creazione di un nuovo descrittore._dup restituisce il descrittore del file successivo disponibile per il file specificato._dup2 impone fd2 per fare riferimento allo stesso file di fd1.Se fd2 è associato a un file aperto al momento della chiamata, verrà chiuso.
Sia _dup che _dup2 accettano i descrittori di file come parametri.Per passare un flusso (FILE *) *)a una di queste funzioni, utilizzare _fileno.La routine di fileno restituisce il descrittore del file attualmente associato al flusso specificato.Di seguito viene illustrato come associare stderr (definito FILE* in Stdio.h) con un descrittore del file:
int cstderr = _dup( _fileno( stderr ));
Requisiti
Routine |
Intestazione obbligatoria |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
La console non è supportata nelle applicazioni di Windows Store.L'handle standard del flusso associate alla console, stdin, stdoute stderr, devono essere reindirizzati prima di funzioni di runtime del linguaggio C possono essere utilizzate nelle applicazioni di Windows Store.Per ulteriori informazioni sulla compatibilità, vedere Compatibilità nell'introduzione.
Esempio
// 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" );
}