_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_errliste _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, stdoute stderrdevono 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'

Vedi anche

I/O di basso livello
_close
_creat, _wcreat
_open, _wopen