EN JA
DUP(2)
DUP(2) FreeBSD System Calls Manual DUP(2)

名称

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

ライブラリ

Standard C Library (libc, -lc)

書式

#include < unistd.h>

int
dup( int oldd);

int
dup2( int oldd, int newd);

解説

dup() システムコールは、既存のオブジェクト記述子を複製し、その値を呼び出しているプロセスに返します ( newd = dup( oldd))。引数 oldd は、プロセスごとの記述子テーブルの小さな負でない整数インデックスです。呼び出しによって返される新しい記述子は、現在、プロセスによって使用されていない最小の番号付けられた記述子です。

記述子によって参照されるオブジェクトは、決して olddnewd を区別しません。したがって、 newdoldd がオープンしたファイルへの重複した参照であるなら、 read(2), write(2)lseek(2) 呼び出しは、すべてファイルへの単一のポインタを移動させ、追加モード、ノンブロッキング I/O と非同期 I/O オプションは、参照の間で共有されます。ファイルへの個別のポインタが要求されるなら、ファイルへの異なるオブジェクトの参照は、追加の open(2) システムコールを発行することによって取得されなければなりません。新しいファイル記述子の close-on-exec フラグは、未設定とされます。

dup2() では、新しい記述子 newd の値が指定されます。この記述子が既に使用中であり、 olddnewd であるなら、記述子は、あたかも close(2) システムコールが使用されたかのように、最初に割り付け解放されます。 oldd が有効な記述子でないなら、 newd は、クローズされません。 oldd == newd であり、 oldd が有効な記述子であるなら、 dup2() は、成功し、何も行いません。

戻り値

これらの呼び出しは、成功したなら、新しいファイル記述子を返します。そうでなければ、値 -1 が、返され、外部変数 errno は、エラーの原因を示す値が設定されます。

エラー

dup() システムコールは、次の場合に失敗します:
[ EBADF]
oldd 引数が有効でアクティブな記述子ではありません。
[ EMFILE]
あまりにも多くの記述子がアクティブです。

dup2() システムコールは、次の場合に失敗します:

[ EBADF]
oldd 引数が有効でアクティブな記述子でないか、または newd 引数が、負であるか、または最大の許可できる記述子の番号を越えています。

規格

dup() と dup2() システムコールは、 IEEE Std 1003.1-1990 (“POSIX.1”) に適合するはずです。

歴史

dup() と dup2() 関数は、 Version 7 AT&T UNIX で登場しました。
June 1, 2013 FreeBSD