_dup
, _dup2
Crea un secondo descrittore del file per un file aperto (_dup
) o riassegna un descrittore del file (_dup2
).
Sintassi
int _dup( int fd );
int _dup2( int fd1, int fd2 );
Parametri
fd
, fd1
Descrittori del file che fanno riferimento al file aperto.
fd2
Qualsiasi descrittore del file.
Valore restituito
_dup
restituisce un nuovo descrittore del file. _dup2
restituisce 0 per indicare l'esito positivo. Se si verifica un errore, ogni funzione restituisce -1 e imposta errno
su EBADF
se il descrittore di file non è valido o su EMFILE
se non sono disponibili altri descrittori di file. Quando viene passato un descrittore di file non valido, la funzione richiama anche il gestore di parametri non validi, come descritto in Convalida dei parametri.
Per altre informazioni sui codici restituiti, vedere errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Osservazioni:
Le funzioni _dup
e _dup2
associano un secondo descrittore del file a un file attualmente aperto. Tali funzioni possono essere utilizzate per associare un descrittore del file predefinito, come quello per stdout
, con un file diverso. Le operazioni sul file possono essere eseguite 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 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, tale file verrà chiuso.
Sia _dup
che _dup2
accettano descrittori del file come parametri. Per passare un flusso (FILE *
) a una di queste funzioni, usare _fileno
. La routine fileno
restituisce il descrittore del file attualmente associato al flusso specificato. L'esempio seguente illustra come associare stderr
(definito come FILE *
in stdio.h
) a un descrittore di file:
int cstderr = _dup( _fileno( stderr ));
Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
La console non è supportata nelle app piattaforma UWP (Universal Windows Platform) (UWP). Gli handle di flusso standard associati alla console, stdin
, stdout
e stderr
devono essere reindirizzati prima che le funzioni di runtime C possano usarle nelle app UWP. Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
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" );
}
This goes to stdout first
This goes to stdout
The file 'data' contains:
This goes to file 'data'