_dup, _dup2

Создайте второй идентификатор файла для открытия файла (_dup), или переназначьте идентификатор файла (_dup2).

int _dup( 
   int fd 
);
int _dup2( 
   int fd1,
   int fd2 
);

Параметры

  • fd, fd1
    Идентификаторы файла при ссылке на открытию файла.

  • fd2
    Любой идентификатор файла.

Возвращаемое значение

_dup возвращает дескриптор нового файла._dup2 возвращает значение 0, чтобы указать успех.При возникновении ошибки, каждая функция возвращает – 1 и задает для errno значение EBADF, если идентификатор файла является недопустимым или значение EMFILE, если больше нет идентификатора файла недоступно.В случае недопустимого идентификатора файла, функция также вызывает обработчик недопустимого параметра, как описано в разделе Проверка параметров.

Дополнительные сведения об этих и других кодах возврата см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr.

Заметки

Функции _dup и _dup2 ниже второй идентификатор файла, в данный момент открытием файла.Их можно использовать для связывания предопределенный идентификатор файла, такое как для stdout, с другим файлом.Выполнение операции в файле можно с помощью любой идентификатор файла.Тип доступа разрешено для файла без изменений при создании нового дескриптора._dup возвращает следующий доступный идентификатор файла для указанного файла._dup2 вызывает fd2 для ссылки на один и тот же файл, что и fd1.Если fd2 связано с открытием файла во время вызова, то этот файл закрыт.

_dup и _dup2 принимают идентификаторы файла в качестве параметров.Для передачи потока (FILE *) в любой из этих функций, используйте _fileno.Процедура fileno возвращает идентификатор файла в данный момент, связанный с данным потоком.В следующем примере показано, как связать stderr (определяется как FILE* в Stdio.h) с идентификатором файла:

int cstderr = _dup( _fileno( stderr ));

Требования

Функция

Требуемый заголовок

_dup

<io.h>

_dup2

<io.h>

Консоль не поддерживается в приложениях Магазина Windows.Стандартные дескрипторы потока, связанные с консолью, stdin, stdout и stderr, необходимо перенаправить до функции C времени выполнения могут использовать их в приложениях Магазина Windows.Дополнительные сведения о совместимости см. в разделе Совместимость во введении.

Пример

// 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" );
}
  

См. также

Ссылки

ВВОДА-ВЫВОДА низкого уровня

_close

_create, _wcreat

_open, _wopen