OPENAT
Section: Linux Programmer's Manual (2)
Updated: 2006-03-06
Index
JM Home Page
roff page
名前
openat - ディレクトリファイルディスクリプタから相対的な位置にあるファイルをオープンする
書式
#define _ATFILE_SOURCE
#include <fcntl.h>
int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);
説明
openat()
システムコールは、この man ページで説明している違いがある以外は、
open(2)
と全く同じように動作する。
pathname
で指定されるパス名が相対パスである場合、
ファイルディスクリプタ
dirfd
で参照されるディレクトリからの相対パス名として解釈される
(open(2)
では、相対パスは呼び出し元プロセスのカレントワーキングディレクトリからの
相対パスとなる)。
pathname
が相対パスであり、かつ
dirfd
が特別な値
AT_FDCWD
である場合、
pathname
は
(open(2)
と同じように) 呼び出し元プロセスの
カレントワーキングディレクトリからの相対パス名として解釈される。
pathname
が絶対パスである場合、
dirfd
は無視される。
返り値
成功した場合、
openat()
は新しいファイルディスクリプタを返す。
エラーの場合、-1 が返されて、
errno
にはエラーを示す値が設定される。
エラー
open(2)
と同じエラーが
openat()
でも起こる。
openat()
では、その他に以下のエラーが起こる:
- EBADF
-
dirfd
が有効なファイルディスクリプタでない。
- ENOTDIR
-
pathname
が相対パスで、かつ
dirfd
がディレクトリ以外のファイルを参照するファイルディスクリプタである。
バージョン
openat()
は Linux カーネル 2.6.16 で追加された。
準拠
このシステムコールは標準的ではないが、
POSIX.1 の将来のリビジョンに含めることが提案されている。
Solaris には、これと同じようなシステムコールが存在する。
注意
openat()
や "at" が後ろに付いたその他の同様のシステムコールは、
2 つの理由により提供されている。
1 つ目の理由は、
カレントワーキングディレクトリ以外のディレクトリにあるファイル群を
open(2)
でオープンするときに起こる可能性がある競合状態 (race condition) を、
openat()
によってアプリケーションが回避できるためである。
これらの競合状態は、
open(2)
に指定されたパスのディレクトリ部分の
(/ で区切られた) いくつかの構成要素 (をオープンする処理) が、
open(2)
を並列に呼び出す処理に変換された場合に起こる。
このような競合は、対象ディレクトリのファイルディスクリプタをオープンし、
そのファイルディスクリプタを
openat()
の
dirfd
引き数に指定することで回避できる。
2 つ目の理由は、
アプリケーションによって管理されるファイルディスクリプタ (群) を使うことで、
openat()
がスレッド毎のいわゆる「カレントワーキングディレクトリ」を実装できるためである。
(この機能は
/proc/self/fd/dirfd
を使った裏技でも実現できるが、あまり効率的ではない)。
関連項目
faccessat(2),
fchmodat(2),
fchownat(2),
fstatat(2),
futimesat(2),
linkat(2),
mkdirat(2),
mknodat(2),
open(2),
readlinkat(2),
renameat(2),
symlinkat(2),
unlinkat(2),
mkfifoat(3),
path_resolution(7)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- バージョン
-
- 準拠
-
- 注意
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:55 GMT, November 19, 2007