_dup, _dup2

開いているファイルの 2 つ目のファイル記述子 (_dup) を作成するか、ファイル記述子 (_dup2) を再割り当てします。

構文

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

パラメーター

fd, fd1
開いているファイルを参照するファイル記述子。

fd2
任意のファイル記述子。

戻り値

_dup は新しいファイル記述子を返します。 _dup2 は成功したことを示すために 0 を返します。 エラーが発生した場合、各関数は -1 をEBADF返し、ファイル記述子が無効な場合、またはそれ以上ファイル記述子が使用できない場合にEMFILE設定errnoします。 無効なファイル記述子が渡されると、「パラメーターの検証」で説明されているように、関数は無効なパラメーター ハンドラーも呼び出します。

リターン コードの詳細については、「errno_doserrno_sys_errlist、および _sys_nerr」を参照してください。

解説

_dup 関数と _dup2 関数は、2 つ目のファイル記述子を現在開いているファイルに関連付けます。 これらの関数は、stdout のような定義済みファイル記述子を別のファイルに関連付けるために使用できます。 ファイル操作はいずれかのファイル記述子を使用して実行できます。 新しい記述子の作成によって、ファイルに対するアクセス権の種類が影響を受けることはありません。 _dup は、指定されたファイルに対して次に使用できるファイル記述子を返します。 _dup2fd2fd1 と同じファイルを参照するよう強制します。 呼び出し時に fd2 が開いているファイルに関連付けられている場合は、そのファイルが閉じられます。

_dup_dup2 はいずれもファイル記述子をパラメーターとして受け取ります。 これらの関数のいずれかにストリーム (FILE *) を渡すには、_fileno を使います。 fileno ルーチンは、指定したストリームに現在関連付けられているファイル記述子を返します。 次の例は、stderr (stdio.hFILE * として定義) をファイル記述子に関連付ける方法を示しています。

int cstderr = _dup( _fileno( stderr ));

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

必要条件

ルーチンによって返される値 必須ヘッダー
_dup <io.h>
_dup2 <io.h>

ユニバーサル Windows プラットフォーム (UWP) アプリではコンソールがサポートされていません。 コンソール (stdinstdoutstderr) に関連付けられている標準ストリームのハンドルは、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'

関連項目

低レベル I/O
_close
_creat, _wcreat
_open, _wopen