DUP(2)

名前
dup, dup2 - ファイル・ディスクリプターを複製する

書式
#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

説明
dup と dup2 は、ファイル・ディスクリプター oldfd の複製を作る。 古いディスクリプターと新しいディスクリプターは同じものとして 使うことができる。 それらはロック(lock)、ファイル位置ポインター、 フラグを共有する。 例えば、片方のディスクリプターの ファイル位置が lseek 使用して変更された場合、、もう片方の位置も変化する。 しかしながら、ふたつのディスクリプターは実行時クローズ(close-on-exec) フラグを共有していない。 dup は使用されていない最小の値のディスクリプターを新しいディスクリプター として使用する。 dup2 は oldfd の複製として newfd を作成する。必要ならば最初に newfd をクローズ(close)する。

返り値
dup と dup2 は新しいディスクリプターを返す。エラーの場合は -1 を返す。 (その時、 errno に適切な値が設定される。)

エラー

EBADF
    oldfd がオープンされたファイル・ディスクリプターでないか、 newfd がファイル・ディスクリプターとして許される範囲から外れている。

EMFILE
    プロセスがすでにオープンできる最大数までファイル・ディスクリプター を開いていて、さらに新しいものを開こうとした。

警告
newfd が範囲を超えた時に返されるエラーは、 dup2 と fcntl(...,F_DUPFD,...) では異っている。 dup2 が F_DUPFD と同じように EINVAL を返すステムもある。

準拠
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. SVr4 には他に EINTR,ENOLINK エラー状態の記述がある。POSIX.1 には他に EINTR がある。

関連項目
fcntl (2), open (2), close (2).