_dup、_dup2
開いているファイルの 2 つ目のファイル記述子 (_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 関数は、2 つ目のファイル記述子を現在開いているファイルに関連付けます。 これらの関数は、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 ストア アプリではサポートされていません。 コンソール (stdin、stdout、および stderr) に関連付けられている標準ストリームのハンドルは、C ランタイム関数によって Windows ストア アプリで使用する前に、リダイレクトする必要があります。 互換性の詳細については、「互換性」を参照してください。
使用例
// 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" );
}