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


_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

_creat, _wcreat

_open, _wopen