DUP(2) — NEWS-OS Programmer’s Manual
名称
dup, dup2 − ディスクリプタを二重化する
形式
newd = dup(oldd)
int newd, oldd;
dup2(oldd, newd)
int oldd, newd;
解説
dup は、 既存のオブジェクトディスクリプタを 二重化します。 引数 oldd は、 プロセス-ディスクリプタテーブル内に収められている負でない小さな整数 インデックスです。 この値は、 getdtablesize(2) によって返されるテーブルサイズより小さくなければなりません。 このコールによって返される新しいディスクリプタ newd は、 現在はプロセスによって使用されていない最も小さい数のディスクリプタです。
ディスクリプタによって参照されるオブジェクトは、 oldd と newd のどちらを 使用して参照しても同じものになります。 したがって、 1個のオープンされているファイルを newd と oldd の両方で二重に参照している場合でも、 read(2) および、 write(2)、 lseek(2) コールはすべてそのファイルへ単一のポインタを 移動し、 append モード、 ブロッキングでない入出力、 および非同期入出力オプションは、 それらの間で共有されます。 そのファイルへの別のポインタがほしい場合には、 open(2) コールを 発行して、 そのファイルに対して異なるオブジェクトとして参照 しなければなりません。 新しいファイルディスクリプタの exec 時クローズフラグはセットされません。
2番目の形式のコールでは、 希望する newd の値を 指定できます。 そのディスクリプタが既に使用されている場合には、 あたかも最初に close(2) コールが実行されたかのように、 そのディスクリプタの最初の割り当ては解除されます。
リターン値
どちらのコールでもエラーが発生した場合には、 値 −1 が返されます。 外部変数 errno がエラーの原因を 示します。
エラー
次の場合には、 dup、 dup2 のいずれも失敗します。
[EBADF] oldd または newd が有効なアクティブディスクリプタではない。
[EMFILE] アクティブになっているディスクリプタが多すぎる。
関連事項
accept(2), open(2), close(2), pipe(2), socket(2), socketpair(2), getdtablesize(2)
NEWS-OSRelease 4.1C