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()
は正常に終了し、何もしません。