_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). Стандартные дескрипторы потока, связанные с консолью, stdin
stdout
и 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