Condividi tramite


_dup, _dup2

Crea un secondo descrittore del file per un file aperto (_dup), o riassegna 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, ogni funzione termina con –1 e imposta errno su EBADF se il descrittore del file non è valido o EMFILE se non esistono descrittori di file disponibili. Nel caso di un descrittore di file non valido, la funzione richiama il gestore del parametro non valido, 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 _dup2 e _dup associano ad un secondo descrittore del file un file aperto. Tali funzioni possono essere utilizzate per associare un descrittore di file predefinito, come quello per stdout, con un file diverso. Le operazioni su file possono essere eseguite utilizzando qualsiasi descrittore del file. Il tipo di accesso consentito per un 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 fd1. Se fd2 è associato ad un file aperto al momento della chiamata, verrà chiuso.

Sia _dup che _dup2 accettano descrittori di file come parametri. Per passare un flusso (FILE *) su una di queste funzioni, utilizzare _fileno. La routine fileno restituisce il descrittore del file attualmente associato al flusso specificato. Di seguito viene illustrato come associare stderr (definito come 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 Windows Store. Gli handle del flusso standard associati alla console,stdin, stdout e stderr, devono essere reindirizzati prima di poter utilizzare le funzioni di runtime del linguaggio C nelle applicazioni Windows Store. Per ulteriori informazioni sulla compatibilità, vedere 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" );
}
  

Vedere anche

Riferimenti

I/O a basso livello

_close

_creat, _wcreat

_open, _wopen