Поделиться через


_dup, _dup2

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

Синтаксис

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

Параметры

fd, fd1
Дескрипторы файлов, ссылающиеся на открытый файл.

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

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

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

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno_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 ));

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

Требования

Маршрут Обязательный заголовок
_dup <io.h>
_dup2 <io.h>

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

Пример

// 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'

См. также

Низкоуровневый ввод-вывод
_close
_creat, _wcreat
_open, _wopen