DUP(2)

名称
dup, dup2 - 既存のファイル記述子を複製する

ライブラリ
libc

書式
<unistd.h> int dup(int oldd) int dup2(int oldd, int newd)

解説
dup() システムコールは、既存のオブジェクト記述子を複製し、 その値を呼び出しプロセスに返します (newd = dup(oldd)) 。 引数 oldd はプロセスの記述子テーブル内のインデックスで、負でない小さな整数です。 その値はテーブルのサイズより小さくなければなりません。 テーブルのサイズは getdtablesize(2) によって返されます。 dup() 呼び出しは、そのときにプロセスによって使用されていない番号のうち、 最も小さい番号の付いた記述子を返します。

記述子が参照するオブジェクトは oldd と newd をまったく区別しません。 したがって newd と oldd がオープンされたファイルへの複製された参照だった場合、すべての read(2), write(2) および lseek(2) 呼び出しは、単一のポインタをファイル内で移動します。 追加モード、ノンブロッキング入出力 および非同期入出力オプションは各参照の間で共有されます。 一つのファイルへの別々のポインタが必要な場合は、追加の open(2) システムコールを呼び出し、ファイルへの異なるオブジェクト参照を 得る必要があります。 このとき、新しいファイル記述子の close-on-exec フラグは設定解除されています。

dup2() には新しい記述子 newd の値を指定します。 この記述子が既に使用されていた場合、 oldd newd であれば、まずその記述子は close(2) システムコールが使用されたかのように割り当て解除されます。 oldd が有効な記述子でなかった場合には、 newd はクローズされません。 oldd == newd であり、しかも oldd が有効な記述子の場合、 dup2() は正常に終了し、何もしません。

戻り値
いずれかの呼び出しでエラーが起きた場合は値 -1 が返されます。 外部変数 errno はエラーの原因を示します。

エラー
dup() システムコールと dup2() システムコールは、次の場合に処理に失敗します:

[EBADF]
    oldd または newd 引数が有効なアクティブ記述子ではありません。

[EMFILE]
    アクティブな記述子が多すぎます。

関連項目
accept(2), close(2), fcntl(2), getdtablesize(2), open(2), pipe(2), socket(2), socketpair(2)

規格
dup() システムコールと dup2() システムコールは、 p1003.1-90 に適合しています。

歴史
dup() 関数と dup2() 関数は AT&T UNIX で登場しました。