_dup
, _dup2
開いているファイルの 2 つ目のファイル記述子 (_dup
) を作成するか、ファイル記述子 (_dup2
) を再割り当てします。
構文
int _dup( int fd );
int _dup2( int fd1, int fd2 );
パラメーター
fd
, fd1
開いているファイルを参照するファイル記述子。
fd2
任意のファイル記述子。
戻り値
_dup
は新しいファイル記述子を返します。 _dup2
は成功したことを示すために 0 を返します。 エラーが発生した場合、各関数は -1 を返し、ファイル記述子が無効な場合はEBADF
にerrno
を設定し、それ以上ファイル記述子が使用できない場合はEMFILE
に設定します。 無効なファイル記述子が渡されると、「 パラメーター検証で説明されているように、関数は無効なパラメーター ハンドラーも呼び出します。
リターン コードの詳細については、「errno
、_doserrno
、_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 ));
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
_dup |
<io.h> |
_dup2 |
<io.h> |
ユニバーサル Windows プラットフォーム (UWP) アプリではコンソールがサポートされていません。 コンソール (stdin
、stdout
、stderr
) に関連付けられている標準ストリームのハンドルは、C ランタイム関数によって UWP アプリで使用される前に、リダイレクトする必要があります。 互換性の詳細については、「 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:" );
_flushall();
system( "type data" );
}
This goes to stdout first
This goes to stdout
The file 'data' contains:
This goes to file 'data'