tail head cat sleep
QR code linking to this page

manページ  — DUP

名称

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 はプロセスの記述子テーブル内のインデックスで、負でない小さな整数です。 その値はテーブルのサイズより小さくなければなりません。 テーブルのサイズは 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() システムコールは、 IEEE Std 1003.1-90 ("POSIX.1") に適合しています。

歴史

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

DUP (2) June 4, 1993

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

… one of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs.
— Robert Firth