_dup_dup2

为打开的文件 (_dup) 创建另一个文件说明符,或重新分配文件说明符 (_dup2)。

语法

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

参数

fdfd1
引用打开的文件的文件说明符。

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 *) 传递到这些函数中的任意一个,请使用 _filenofileno 例程返回当前与给定流相关联的文件说明符。 下面的示例演示如何将 stderr(在 stdio.h 中定义为 FILE *)与文件描述符相关联:

int cstderr = _dup( _fileno( stderr ));

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态

要求

例程 必需的标头
_dup <io.h>
_dup2 <io.h>

通用 Windows 平台 (UWP) 应用中不支持控制台。 与控制台、stdinstdoutstderr 关联的标准流句柄必须重定向,然后 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'

另请参阅

低级别 I/O
_close
_creat_wcreat
_open_wopen