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.

If it wasn't for C, we'd be using BASI, PASAL and OBOL