_dup、_dup2
_dup は、開いているファイルのファイル記述子をもう 1 つ作成します。_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 は、fd1 と同じファイルを fd2 で強制的に参照できるようにします。 呼び出しの時点で開かれているファイルに fd2 を関連付けると、そのファイルは閉じられます。
_dup および _dup2 は、どちらもパラメーターとしてファイル記述子を受け取ります。 これらの関数のいずれかに (FILE *) ストリームを渡すには、_fileno を使用します。 fileno ルーチンは、特定のストリームに現在関連付けられているファイル記述子を返します。 STDIO.H で FILE * として定義されている stderr をファイル記述子に関連付ける方法の例を次に示します。
int cstderr = _dup( _fileno( stderr ));
必要条件
ルーチン |
必須ヘッダー |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// 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" );
}