dup(2) FreeBSD 一般コマンドマニュアル

dup

前のページ 上に戻る 次のページ

dup




書式

     #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 の値を指定します。この記述子が既に使用されて
     いた場合、 oldd != newd であれば、まずその記述子は close(2) が呼び出され
     たかのように割り当て解除されます。 oldd が有効な記述子でなかった場合に
     は、 newd はクローズされません。 oldd == newd であり、しかも oldd が有効
     な記述子の場合、 dup2() は正常に終了し、何もしません。


実装に関する注

     非スレッドライブラリ dup() は dup システムコールとして実装されています。

     スレッドライブラリの場合、 dup システムコールが _thread_sys_dup() にアセ
     ンブルされ、 dup() は読み書きについて oldd をロックしてから、
     _thread_sys_dup() を呼び出す関数として実装されています。戻る前に dup() は
     oldd をアンロックします。

     非スレッドライブラリ dup2() は、 dup2 システムコールとして実現されます。

     スレッドライブラリでは、 dup2 システムコールは _thread_sys_dup2() にアセ
     ンブルされ、 dup2() は、読み書きについて olddnewd の両方をロックして
     から、 _thread_sys_dup2() を呼び出す関数として実現されます。戻る前に、
     dup2() は olddnewd をアンロックします。


戻り値

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

     います。


歴史

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

FreeBSD 4.4                      June 4, 1993                      FreeBSD 4.4

ABELNET VPSサービス