DUP
Section: Linux Programmer's Manual (2)
Updated: 2008-10-09
Index
JM Home Page
roff page
名前
dup, dup2, dup3 - ファイル・ディスクリプタを複製する
書式
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
#define _GNU_SOURCE
#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)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- バージョン
-
- 準拠
-
- 注意
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 03:26:40 GMT, April 25, 2010