_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 (定义为 Stdio.h 的 FILE* ) 与文件描述符:
int cstderr = _dup( _fileno( stderr ));
要求
实例 |
必需的标头 |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
控件个在 Windows 应用商店 apps 不受支持。 标准流处理与控件个,stdin,stdout和 stderr,在 C 运行时函数在 Windows 应用商店 apps 之前,可以使用它们必须重定向。 有关更多兼容性信息,请参见中介绍的 兼容性。
示例
// 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" );
}