スポンサーリンク

DUP(2) FreeBSD システムコールマニュアル DUP(2)

名称

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

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <unistd.h>

int

dup(int oldd);

int

dup2(int oldd, int newd);

解説

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

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

dup2() には新しい記述子 newd の値を指定します。この記述子が既に使用されて いた場合、 olddnewd であれば、まずその記述子は 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() システムコールは、 ISO/IEC 9945-1:1990 (‘‘POSIX.1’’) に適合しています。

歴史

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

FreeBSD 10.0 June 4, 1993 FreeBSD 10.0

スポンサーリンク