_dup、_dup2
ファイルを開く (_dup) の 2 番目のファイル記述子を作成するか、ファイル記述子 (_dup2) を再割り当てします。
int _dup(
int fd
);
int _dup2(
int fd1,
int fd2
);
パラメーター
fd, fd1
開いているファイルを参照するファイル記述子。fd2
ファイル記述子。
戻り値
_dup は、新しいファイル記述子を返します。_dup2 は成功を示す場合は 0 を返します。エラーが発生すると、これ以上のファイル記述子が使用可能であるファイル記述子が void または EMFILE な各関数の戻り値–1 は EBADF に errno を設定します。無効なファイル記述子の場合、関数はまたは パラメーターの検証に説明されているように、無効なパラメーター ハンドラーが実行されます。
リターン コードの詳細については、「_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 ストア の apps ではサポートされていません。コンソール、stdin、stdout、および stderrに関連付けられている標準ストリームのハンドルは C のランタイム関数が Windows ストア の apps で使用する前にをリダイレクトする必要があります。互換性の詳細については、「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" );
}