Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all 

名前
dup, dup2, dup3 - ファイルディスクリプタを複製する
書式
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
#define _GNU_SOURCE /* feature_test_macros(7) 参照 */
#include <fcntl.h> /* 定数 O_* の定義の取得 */
#include <unistd.h>
int dup3(int oldfd, int newfd, int flags);
説明
これらのシステムコールは、ファイルディスクリプタ oldfd の複製を作る。
dup() は最も小さい番号の未使用のディスクリプタを 新しいディスクリプタとして使用する。
dup2() は newfd を oldfd の複製として作成する。 必要であれば最初に newfd をクローズする。 以下の点に注意
すること。
* oldfd が有効なファイルディスクリプタでない場合、その呼び出しは失敗し、 newfd はクローズされない。
* oldfd が有効なファイルディスクリプタで、 newfd が oldfd と同じ値の場合、 dup2() は何もせず、 newfd を
返す。
これらのシステムコールのいずれかが成功を返した場合には、 古いファイルディスクリプタと新しいファイルディス
クリプタは 互いに可換なものとして使うことができる。 2つのファイルディスクリプタは同じファイル記述
(description) (open(2) 参照) を参照しており、したがってファイルオフセットやファイル状態フラグが 共有さ
れる。例えば、一方のディスクリプタに対して lseek(2) を使ってファイルオフセットを変更した場合、もう一方の
ディスクリプタの オフセットも変化する。
2つのディスクリプタはファイルディスクリプタフラグ (close-on-exec flag) を共有しない。複製されたディスク
リプタの close-on-exec flag (fcntl(2) 参照) は off となる。
dup3() は dup2() と同じだが、以下の点が異なる。
* 呼び出し元が、新しいファイルディスクリプタに対して close-on-exec フラグを強制的に設定することができ
る。 これを行うには、 flags に O_CLOEXEC を指定する。 このフラグが役に立つ理由については、 open(2) の
O_CLOEXEC フラグの説明を参照のこと。
* oldfd が newfd と同じ場合、 dup3() は EINVAL エラーで失敗する。
返り値
成功すると、これらのシステムコールは新しいディスクリプタを返す。 エラーの場合、-1 を返し、 errno を適切に
設定する。
エラー
EBADF oldfd がオープンされたファイルディスクリプタでないか、 newfd がファイルディスクリプタとして許され
る範囲から外れている。
EBUSY (Linux のみ) open(2) や dup() との競合状態の場合に、 dup2() や dup3() はこのエラーを返すかもし
れない。
EINTR dup2() や dup3() の呼び出しがシグナルにより割り込まれた。 signal(7) 参照。
EINVAL (dup3()) flags に無効な値が入っている。 もしくは、 oldfd が newfd と同じであった。
EMFILE プロセスがすでにオープンできる最大数までファイルディスクリプタ を開いていて、さらに新しいものを開
こうとした。
バージョン
dup3() はバージョン 2.6.27 で Linux に追加された。 glibc によるサポートはバージョン 2.9 以降で利用でき
る。
準拠
dup(), dup2(): SVr4, 4.3BSD, POSIX.1-2001.
dup3() は Linux 固有である。
注意
newfd が範囲を超えた時に返されるエラーは、 dup2() と fcntl(..., F_DUPFD, ...) では異っている。 dup2()
が F_DUPFD と同じように EINVAL を返すシステムもある。
newfd がオープンされていると、 close(2) した時に報告されるはずのエラーが失われてしまう。 dup2() や
dup3() を使う前に先ず newfd をクローズするようにした方がいいだろう。
関連項目
close(2), fcntl(2), open(2)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告
に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
Linux 2012-02-14 DUP(2)