%>
为打开的文件 (_dup
) 创建另一个文件说明符,或重新分配文件说明符 (_dup2
)。
语法
int _dup( int fd );
int _dup2( int fd1, int fd2 );
参数
%>
引用打开的文件的文件说明符。
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
(在 stdio.h
中定义为 FILE *
)与文件描述符相关联:
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'