名前
dup, dup2 - ファイル・ディスクリプタを複製する
書式
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
説明
dup() と dup2() は、ファイル・ディスクリプタ oldfd の複製を作る。
dup() または dup2() が成功を返した場合には、 古いファイル・ディスクリプタと新しいファイル・ディスクリプタは 互いに可換なものとして使うことができる。 2つのファイル・ディスクリプタは同じファイル記述 (description) (open(2) 参照) を参照しており、したがってファイルオフセットやファイル状態フラグが 共有される。例えば、一方のディスクリプタに対して lseek(2) を使ってファイルオフセットを変更した場合、もう一方のディスクリプタの オフセットも変化する。
2つのディスクリプタはファイル・ディスクリプタ・フラグ (close-on-exec flag) を共有しない。複製されたディスクリプタの close-on-exec flag (fcntl(2) 参照) は off となる。
dup() は使用されていない最小の値のディスクリプタを新しいディスクリプタ として使用する。
dup2() は oldfd の複製として newfd を作成する。必要ならば最初に newfd をクローズ (close) する。
返り値
dup() と dup2() は新しいディスクリプタを返す。エラーの場合は -1 を返す (その時 errno に適切な値が設定される。)
エラー
EBADF | oldfd がオープンされたファイル・ディスクリプタでないか、 newfd がファイル・ディスクリプタとして許される範囲から外れている。 |
EBUSY | (Linux のみ) open(2) や dup() との競合状態の場合に、 dup2() はこのエラーを返すかもしれない。 |
EINTR | dup2() の呼び出しがシグナルによって割り込まれた (interrupt)。 |
EMFILE | プロセスがすでにオープンできる最大数までファイル・ディスクリプタ を開いていて、さらに新しいものを開こうとした。 |
準拠
SVr4, 4.3BSD, POSIX.1-2001.
注意
newfd が範囲を超えた時に返されるエラーは、 dup2() と fcntl(..., F_DUPFD, ...) では異っている。 dup2() が F_DUPFD と同じように EINVAL を返すシステムもある。
newfd がオープンされていると、 close(2) した時に報告されるはずのエラーが失われてしまう。 dup2() を使う前に先ず newfd をクローズするようにした方がいいだろう。