_dup、_dup2_dup, _dup2

開いているファイル (_dup) の2番目のファイル記述子を作成するか、ファイル記述子 (_dup2) を再割り当てします。Creates a second file descriptor for an open file (_dup), or reassigns a file descriptor (_dup2).


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


fdfd1fd, fd1
開いているファイルを参照するファイル記述子。File descriptors referring to open file.

任意のファイル記述子。Any file descriptor.

戻り値Return Value

_dup は新しいファイル記述子を返します。_dup returns a new file descriptor. 成功を示すには _dup2 0 を返します。_dup2 returns 0 to indicate success. エラーが発生した場合、各関数は-1 を返し、ファイル記述子が無効で ある場合は errno に、ファイル記述子が使用できない場合は EMFILE に設定します。If an error occurs, each function returns -1 and sets errno to EBADF if the file descriptor is invalid or to EMFILE if no more file descriptors are available. ファイル記述子が無効な場合、「パラメーターの検証」で説明されているように、関数によって無効なパラメーター ハンドラーも開始されます。In the case of an invalid file descriptor, the function also invokes the invalid parameter handler, as described in Parameter Validation.

リターン コードの詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。For more information about these and other return codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.


_Dup 関数と _dup2 関数は、2番目のファイル記述子を現在開いているファイルに関連付けます。The _dup and _dup2 functions associate a second file descriptor with a currently open file. これらの関数を使用すると、 stdout などの定義済みのファイル記述子を別のファイルに関連付けることができます。These functions can be used to associate a predefined file descriptor, such as that for stdout, with a different file. ファイル操作はいずれかのファイル記述子を使用して実行できます。Operations on the file can be carried out using either file descriptor. 新しい記述子の作成によって、ファイルに対するアクセス権の種類が影響を受けることはありません。The type of access allowed for the file is unaffected by the creation of a new descriptor. _dup は、指定されたファイルに対して次に使用できるファイル記述子を返します。_dup returns the next available file descriptor for the given file. _dup2 は、 fd2fd1 と同じファイルを参照するように強制します。_dup2 forces fd2 to refer to the same file as fd1. 呼び出し時に fd2 が開いているファイルに関連付けられている場合、そのファイルは閉じています。If fd2 is associated with an open file at the time of the call, that file is closed.

_Dup_dup2 はどちらもファイル記述子をパラメーターとして受け取ります。Both _dup and _dup2 accept file descriptors as parameters. FILE *これらの関数のいずれかにストリーム () を渡すには、 _filenoを使用します。To pass a stream (FILE *) to either of these functions, use _fileno. Fileno ルーチンは、指定されたストリームに現在関連付けられているファイル記述子を返します。The fileno routine returns the file descriptor currently associated with the given stream. 次の例は、stderr にとして定義されている stderr をファイル記述子と関連付ける方法を示して FILE * います。The following example shows how to associate stderr (defined as FILE * in Stdio.h) with a file descriptor:

int cstderr = _dup( _fileno( stderr ));

既定では、この関数のグローバル状態はアプリケーションにスコープが設定されています。By default, this function's global state is scoped to the application. これを変更するには、「 CRT でのグローバル状態」を参照してください。To change this, see Global state in the CRT.


ルーチンによって返される値Routine 必須ヘッダーRequired header
_dup_dup <io.h>
_dup2_dup2 <io.h>

コンソールは、ユニバーサル Windows プラットフォーム (UWP) アプリではサポートされていません。The console is not supported in Universal Windows Platform (UWP) apps. コンソール、 stdinstdout、および stderr に関連付けられている標準ストリームハンドルは、C ランタイム関数が UWP アプリで使用できるようになる前にリダイレクトする必要があります。The standard stream handles that are associated with the console, stdin, stdout, and stderr, must be redirected before C run-time functions can use them in UWP apps. 互換性について詳しくは、「 Compatibility」をご覧ください。For more compatibility information, see Compatibility.


// 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:" );
   system( "type data" );
This goes to stdout first
This goes to stdout

The file 'data' contains:
This goes to file 'data'

関連項目See also

低レベル i/oLow-Level I/O
_creat、_wcreat_creat, _wcreat
_open、_wopen_open, _wopen