Man page - creat(2)

Packages contains this manual

Available languages:

en fr pl ja ru de

Manual

OPEN

名 前
書 式
説 明
creat()
openat()
openat2(2)
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
オ ー プ ン フ ァ イ ル 記 述
同 期 I/O
C ラ イ ブ ラ リ と カ ー ネ ル の 違 い
NFS
FIFOs
フ ァ イ ル ア ク セ ス モ ー ド
openat() や 他 の デ ィ レ ク ト リ フ ァ イ ル デ ィ ス ク リ プ タ ー API の 基 本 原 理
O_DIRECT
バ グ
関 連 項 目
こ の 文 書 に つ い て

名 前

open, openat, creat - フ ァ イ ル の オ ー プ ン 、 作 成 を 行 う

書 式

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char * pathname , int flags );
int open(const char *
pathname , int flags , mode_t mode );

int creat(const char * pathname , mode_t mode );

int openat(int dirfd , const char * pathname , int flags );
int openat(int
dirfd , const char * pathname , int flags , mode_t mode );

/* Documented separately, in openat2 (2): */
int openat2(int
dirfd , const char * pathname ,
const struct open_how *
how , size_t size );

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 ( feature_test_macros (7) 参 照 ):

openat ():

glibc 2.10 以 降 :

_POSIX_C_SOURCE >= 200809L

glibc 2.10 よ り 前 :

_ATFILE_SOURCE

説 明

The open () system call opens the file specified by pathname . If the specified file does not exist, it may optionally (if O_CREAT is specified in flags ) be created by open ().

The return value of open () is a file descriptor, a small, nonnegative integer that is used in subsequent system calls ( read (2), write (2), lseek (2), fcntl (2), etc.) to refer to the open file. The file descriptor returned by a successful call will be the lowest-numbered file descriptor not currently open for the process.

デ フ ォ ル ト で は 、 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー は execve (2) を 実 行 し た 後 も オ ー プ ン さ れ た ま ま と な る (つ ま り 、 fcntl (2) に 説 明 が あ る FD_CLOEXEC フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ は 最 初 は 無 効 で あ る ); 後 述 の O_CLOEXEC フ ラ グ を 使 う と こ の デ フ ォ ル ト を 変 更 す る こ と が で き る 。 フ ァ イ ル オ フ セ ッ ト (file offset) は フ ァ イ ル の 先 頭 に 設 定 さ れ る ( lseek (2) 参 照 )。

open () を 呼 び 出 す と 、 「 オ ー プ ン フ ァ イ ル 記 述 」 (open file description) が 作 成 さ れ る 。 フ ァ イ ル 記 述 と は 、 シ ス テ ム 全 体 の オ ー プ ン 中 の フ ァ イ ル の テ ー ブ ル の エ ン ト リ ー で あ る 。 こ の オ ー プ ン フ ァ イ ル 記 述 は 、 フ ァ イ ル オ フ セ ッ ト と フ ァ イ ル 状 態 フ ラ グ (下 記 参 照 ) が 保 持 す る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー は オ ー プ ン フ ァ イ ル っ 記 述 へ の 参 照 で あ る 。 こ の 後 で pathname が 削 除 さ れ た り 、 他 の フ ァ イ ル を 参 照 す る よ う に 変 更 さ れ た り し て も 、 こ の 参 照 は 影 響 を 受 け な い 。 オ ー プ ン フ ァ イ ル 記 述 の 詳 細 な 説 明 は 「 注 意 」 の 節 を 参 照 。

引 数 flags に は 、 ア ク セ ス モ ー ド O_RDONLY , O_WRONLY , O_RDWR の ど れ か ひ と つ が 入 っ て い な け れ ば な ら な い 。 こ れ ら は そ れ ぞ れ 読 み 込 み 専 用 、 書 き 込 み 専 用 、 読 み 書 き 用 に フ ァ イ ル を オ ー プ ン す る こ と を 要 求 す る も の で あ る 。

In addition, zero or more file creation flags and file status flags can be bitwise- or ’d in flags . The file creation flags are O_CLOEXEC , O_CREAT , O_DIRECTORY , O_EXCL , O_NOCTTY , O_NOFOLLOW , O_TMPFILE , and O_TRUNC . The file status flags are all of the remaining flags listed below. The distinction between these two groups of flags is that the file creation flags affect the semantics of the open operation itself, while the file status flags affect the semantics of subsequent I/O operations. The file status flags can be retrieved and (in some cases) modified; see fcntl (2) for details.

す べ て の フ ァ イ ル 作 成 フ ラ グ と フ ァ イ ル 状 態 フ ラ グ を 以 下 の リ ス ト に 示 す 。
O_APPEND

The file is opened in append mode. Before each write (2), the file offset is positioned at the end of the file, as if with lseek (2). The modification of the file offset and the write operation are performed as a single atomic step.

O_APPEND may lead to corrupted files on NFS filesystems if more than one process appends data to a file at once. This is because NFS does not support appending to a file, so the client kernel has to simulate it, which can’t be done without a race condition.

O_ASYNC

シ グ ナ ル 駆 動 I/O (signal-driven I/O) を 有 効 に す る : こ の フ ァ イ ル デ ィ ス ク リ プ タ ー へ の 入 力 ま た は 出 力 が 可 能 に な っ た 場 合 に 、 シ グ ナ ル を 生 成 す る (デ フ ォ ル ト は SIGIO で あ る が 、 fcntl (2) に よ っ て 変 更 可 能 で あ る )。 こ の 機 能 が 使 用 可 能 な の は 端 末 、 疑 似 端 末 、 ソ ケ ッ ト の み で あ り 、 (Linux 2.6 以 降 で は ) パ イ プ と FIFO に 対 し て も 使 用 で き る 。 さ ら に 詳 し い 説 明 は fcntl (2) を 参 照 す る こ と 。 下 記 の 「 バ グ 」 も 参 照 。

O_CLOEXEC (Linux 2.6.23 以 降 )

新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て close-on-exec フ ラ グ を 有 効 に す る 。 こ の フ ラ グ を 指 定 す る こ と で 、 プ ロ グ ラ ム は FD_CLOEXEC フ ラ グ を セ ッ ト す る た め に fcntl (2) F_SETFD 操 作 を 別 途 呼 び 出 す 必 要 が な く な る 。

あ る 種 の マ ル チ ス レ ッ ド の プ ロ グ ラ ム は こ の フ ラ グ の 使 用 は 不 可 欠 で あ る 点 に 注 意 す る こ と 。 な ぜ な ら 、 個 別 に FD_CLOEXEC フ ラ グ を 設 定 す る fcntl (2) F_SETFD 操 作 を 呼 び 出 し た と し て も 、 あ る ス レ ッ ド が フ ァ イ ル デ ィ ス ク リ プ タ ー を オ ー プ ン す る の と 同 時 に 別 の ス レ ッ ド が fork (2) と execve (2) を 実 行 す る と い う 競 合 条 件 を 避 け る の に は 十 分 で は な い か ら で あ る 。 実 行 の 順 序 に 依 存 し て 、 こ の 競 合 条 件 の 結 果 、 open () が 返 し た フ ァ イ ル デ ィ ス ク リ プ タ ー が fork (2) で 作 成 さ れ た 子 プ ロ セ ス に よ り 実 行 さ れ る プ ロ グ ラ ム に 意 図 せ ず 見 え て し ま う 可 能 性 が あ る 。 (こ の 種 の 競 合 は 、 本 質 的 に 、 close-on-exec フ ラ グ を セ ッ ト す べ き フ ァ イ ル デ ィ ス ク リ プ タ ー を 作 成 す る ど の シ ス テ ム コ ー ル で も 起 こ り 得 る も の で あ り 、 他 の い ろ い ろ な Linux シ ス テ ム コ ー ル で こ の 問 題 に 対 処 す る た め に O_CLOEXEC と 同 等 の 機 能 が 提 供 さ れ て い る 。 )

O_CREAT

If pathname does not exist, create it as a regular file.

The owner (user ID) of the new file is set to the effective user ID of the process.

The group ownership (group ID) of the new file is set either to the effective group ID of the process (System V semantics) or to the group ID of the parent directory (BSD semantics). On Linux, the behavior depends on whether the set-group-ID mode bit is set on the parent directory: if that bit is set, then BSD semantics apply; otherwise, System V semantics apply. For some filesystems, the behavior also depends on the bsdgroups and sysvgroups mount options described in mount (8).

The mode argument specifies the file mode bits to be applied when a new file is created. If neither O_CREAT nor O_TMPFILE is specified in flags , then mode is ignored (and can thus be specified as 0, or simply omitted). The mode argument must be supplied if O_CREAT or O_TMPFILE is specified in flags ; if it is not supplied, some arbitrary bytes from the stack will be applied as the file mode.

The effective mode is modified by the process’s umask in the usual way: in the absence of a default ACL, the mode of the created file is (mode & ~umask) .

Note that mode applies only to future accesses of the newly created file; the open () call that creates a read-only file may well return a read/write file descriptor.

mode の た め に 以 下 の シ ン ボ ル 定 数 が 提 供 さ れ て い る :

S_IRWXU

00700 ユ ー ザ ー (フ ァ イ ル の 所 有 者 ) に 読 み 込 み 、 書 き 込 み 、 実 行 の 許 可 が あ る 。

S_IRUSR

00400 ユ ー ザ ー に 読 み 込 み の 許 可 が あ る 。

S_IWUSR

00200 ユ ー ザ ー に 書 き 込 み の 許 可 が あ る 。

S_IXUSR

00100 ユ ー ザ ー に 実 行 の 許 可 が あ る 。

S_IRWXG

00070 グ ル ー プ に 読 み 込 み 、 書 き 込 み 、 実 行 の 許 可 が あ る 。

S_IRGRP

00040 グ ル ー プ に 読 み 込 み の 許 可 が あ る 。

S_IWGRP

00020 グ ル ー プ に 書 き 込 み の 許 可 が あ る 。

S_IXGRP

00010 グ ル ー プ に 実 行 の 許 可 が あ る 。

S_IRWXO

00007 他 人 (others) に 読 み 込 み 、 書 き 込 み 、 実 行 の 許 可 が あ る 。

S_IROTH

00004 他 人 に 読 み 込 み の 許 可 が あ る 。

S_IWOTH

00002 他 人 に 書 き 込 み の 許 可 が あ る 。

S_IXOTH

00001 他 人 に 実 行 の 許 可 が あ る 。

According to POSIX, the effect when other bits are set in mode is unspecified. On Linux, the following bits are also honored in mode :

S_ISUID

0004000 set-user-ID bit

S_ISGID

0002000 set-group-ID bit (see inode (7)).

S_ISVTX

0001000 sticky bit (see inode (7)).

O_DIRECT (Linux 2.4.10 以 降 )

こ の フ ァ イ ル に 対 す る I/O の キ ャ ッ シ ュ の 効 果 を 最 小 化 し よ う と す る 。 こ の フ ラ グ を 使 う と 、 一 般 的 に 性 能 が 低 下 す る 。 し か し ア プ リ ケ ー シ ョ ン が 独 自 に キ ャ ッ シ ン グ を 行 っ て い る よ う な 特 別 な 場 合 に は 役 に 立 つ 。 フ ァ イ ル の I/O は ユ ー ザ ー 空 間 バ ッ フ ァ ー に 対 し て 直 接 行 わ れ る 。 O_DIRECT フ ラ グ 自 身 は デ ー タ を 同 期 で 転 送 し よ う と は す る が 、 O_SYNC フ ラ グ の よ う に デ ー タ と 必 要 な メ タ デ ー タ の 転 送 が 保 証 さ れ る わ け で は な い 。 同 期 I/O を 保 証 す る た め に は 、 O_DIRECT に 加 え て O_SYNC を 使 用 し な け れ ば な ら な い 。 下 記 の 「 注 意 」 の 節 の 議 論 も 参 照 。

ブ ロ ッ ク デ バ イ ス に 対 す る 似 通 っ た 意 味 の イ ン タ ー フ ェ ー ス が raw (8) で 説 明 さ れ て い る (但 し 、 こ の イ ン タ ー フ ェ ー ス は 非 推 奨 で あ る )。

O_DIRECTORY

pathname が デ ィ レ ク ト リ で な け れ ば オ ー プ ン は 失 敗 す る 。 こ の フ ラ グ は 、 opendir (3) が FIFO や テ ー プ デ バ イ ス に 対 し て コ ー ル さ れ た 場 合 の サ ー ビ ス 不 能 (denial-of-service) 攻 撃 を 避 け る た め に カ ー ネ ル 2.1.126 で 追 加 さ れ た 。

O_DSYNC

フ ァ イ ル に 対 す る 書 き 込 み 操 作 は 、 同 期 I/O の デ ー タ 完 全 性 完 了 の 要 件 に 基 づ い て 行 わ れ る 。

write (2) (や 同 様 の コ ー ル ) が 返 る ま で に 、 書 き 込 ま れ た デ ー タ お よ び デ ー タ を 取 得 す る の に 必 要 な フ ァ イ ル メ タ デ ー タ が 裏 で 利 用 さ れ て い る ハ ー ド ウ ェ ア に 転 送 さ れ る (つ ま り 、 write (2) の 後 に fdatasync (2) を 呼 び 出 し た の と 同 じ よ う に な る )。 下 記 の 「 注 意 」 も 参 照 の こ と

O_EXCL

こ の 呼 び 出 し で フ ァ イ ル が 作 成 さ れ る こ と を 保 証 す る 。 こ の フ ラ グ が O_CREAT と 一 緒 に 指 定 さ れ 、 pathname の フ ァ イ ル が 既 に 存 在 し た 場 合 、 open () は EEXIST エ ラ ー で 失 敗 す る 。

こ れ ら 二 つ の フ ラ グ が 指 定 さ れ た 際 、 シ ン ボ リ ッ ク リ ン ク は 辿 ら れ な い 。 pathname が シ ン ボ リ ッ ク リ ン ク の 場 合 、 シ ン ボ リ ッ ク リ ン ク が ど こ を 指 し て い る か に 関 わ ら ず open () は 失 敗 す る 。

一 般 的 に は 、 O_CREAT を 指 定 せ ず に O_EXCL を 使 用 し た 場 合 の O_EXCL の 動 作 は 規 定 さ れ て い な い 。 こ れ に は 一 つ 例 外 が あ り 、 Linux 2.6 以 降 で は 、 pathname が ブ ロ ッ ク デ バ イ ス を 参 照 し て い る 場 合 、 O_CREAT な し で O_EXCL を 使 用 す る こ と が で き る 。 シ ス テ ム が そ の ブ ロ ッ ク デ バ イ ス を 使 用 中 の 場 合 (例 え ば 、 マ ウ ン ト さ れ て い る な ど )、 open () は エ ラ ー EBUSY で 失 敗 す る 。

NFS で は 、 O_EXCL は 、 Linux 2.6 以 降 で NFSv3 以 降 を 使 っ て い る 場 合 で の み サ ポ ー ト さ れ る 。 O_EXCL サ ポ ー ト が 提 供 さ れ て い な い NFS 環 境 で は 、 こ の フ ラ グ に 頼 っ て ロ ッ ク 処 理 を 実 行 す る プ ロ グ ラ ム は 競 合 状 態 (race condition) に 出 会 う 可 能 性 が あ る 。 ロ ッ ク フ ァ イ ル を 使 用 し て 不 可 分 (atomic) な フ ァ イ ル ロ ッ ク を 実 現 し 、 NFS が O_EXCL を サ ポ ー ト し て い る か に 依 存 し な い よ う に し た い 場 合 、 移 植 性 の あ る 方 法 は 、 同 じ フ ァ イ ル シ ス テ ム 上 に 他 と 名 前 の 重 な ら な い フ ァ イ ル (例 え ば ホ ス ト 名 と PID を 組 み 合 わ せ た 名 前 ) を 作 成 し 、 link (2) を 使 用 し て そ の ロ ッ ク フ ァ イ ル へ の リ ン ク を 作 成 す る こ と で あ る 。 link (2) コ ー ル の 返 り 値 が 0 な ら ば ロ ッ ク に 成 功 し て い る 。 あ る い は 、 そ の フ ァ イ ル に stat (2) を 使 用 し て リ ン ク 数 (link count) が 2 に な っ て い る か を チ ェ ッ ク す る 。 そ う な っ て い れ ば 、 同 じ く ロ ッ ク に 成 功 し て い る と い う こ と で あ る 。

O_LARGEFILE

(LFS) off_t で は サ イ ズ を 表 せ な い (だ だ し off64_t で は サ イ ズ を 表 せ る )フ ァ イ ル を オ ー プ ン 可 能 に す る 。 こ の 定 義 を 有 効 に す る た め に は 、 ( ど の ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り も 前 に ) _LARGEFILE64_SOURCE マ ク ロ を 定 義 し な け れ ば な ら な い 。 32 ビ ッ ト シ ス テ ム に お い て 大 き な フ ァ イ ル に ア ク セ ス し た い 場 合 、 ( O_LARGEFILE を 使 う よ り も ) _FILE_OFFSET_BITS 機 能 検 査 マ ク ロ を 64 に セ ッ ト す る 方 が 望 ま し い 方 法 で あ る ( feature_test_macros (7) を 参 照 )。

O_NOATIME (Linux 2.6.8 以 降 )

Do not update the file last access time ( st_atime in the inode) when the file is read (2).

This flag can be employed only if one of the following conditions is true:

*

The effective UID of the process matches the owner UID of the file.

*

The calling process has the CAP_FOWNER capability in its user namespace and the owner UID of the file has a mapping in the namespace.

こ の フ ラ グ は イ ン デ ッ ク ス 作 成 や バ ッ ク ア ッ プ プ ロ グ ラ ム で 使 う こ と を 意 図 し て い る 。 こ れ を 使 う と デ ィ ス ク に 対 す る 操 作 を 大 幅 に 減 ら す こ と が で き る 。 こ の フ ラ グ は 全 て の フ ァ イ ル シ ス テ ム に 対 し て 有 効 で あ る わ け で は な い 。 そ の 一 例 が NFS で あ り 、 サ ー バ が ア ク セ ス 時 刻 を 管 理 し て い る 。

O_NOCTTY

pathname が 端 末 (terminal) デ バ イ ス — tty (4) 参 照 — を 指 し て い る 場 合 に 、 た と え そ の プ ロ セ ス が 制 御 端 末 を 持 っ て い な く て も 、 オ ー プ ン し た フ ァ イ ル は 制 御 端 末 に は な ら な い 。

O_NOFOLLOW

If the trailing component (i.e., basename) of pathname is a symbolic link, then the open fails, with the error ELOOP . Symbolic links in earlier components of the pathname will still be followed. (Note that the ELOOP error that can occur in this case is indistinguishable from the case where an open fails because there are too many symbolic links found while resolving components in the prefix part of the pathname.)

This flag is a FreeBSD extension, which was added to Linux in version 2.1.126, and has subsequently been standardized in POSIX.1-2008.

See also O_PATH below.

O_NONBLOCK ま た は O_NDELAY

可 能 な ら ば 、 フ ァ イ ル は 非 停 止 (nonblocking) モ ー ド で オ ー プ ン さ れ る 。 open () も 、 返 し た フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 す る 以 後 の す べ て の 操 作 も 呼 び 出 し た プ ロ セ ス を 待 た せ る こ と は な い 。

Note that the setting of this flag has no effect on the operation of poll (2), select (2), epoll (7), and similar, since those interfaces merely inform the caller about whether a file descriptor is "ready", meaning that an I/O operation performed on the file descriptor with the O_NONBLOCK flag clear would not block.

Note that this flag has no effect for regular files and block devices; that is, I/O operations will (briefly) block when device activity is required, regardless of whether O_NONBLOCK is set. Since O_NONBLOCK semantics might eventually be implemented, applications should not depend upon blocking behavior when specifying this flag for regular files and block devices.

FIFO (名 前 付 き パ イ プ ) を 扱 う 場 合 に は fifo (7) も 参 照 す る こ と 。 強 制 フ ァ イ ル ロ ッ ク (mandatory file lock) や フ ァ イ ル リ ー ス (file lease) と 組 み 合 わ せ た 場 合 の 、 O_NONBLOCK の 効 果 に つ い て の 議 論 は 、 fcntl (2) を 参 照 す る こ と 。

O_PATH (Linux 2.6.39 以 降 )

こ の フ ラ グ を 指 定 し て 取 得 し た フ ァ イ ル デ ィ ス ク リ プ タ ー は 、 フ ァ イ ル シ ス テ ム ツ リ ー 内 で の 場 所 を 示 す た め 、 純 粋 に フ ァ イ ル デ ィ ス ク リ プ タ ー レ ベ ル で の 作 用 す る 操 作 を 実 行 す る た め 、 の 二 つ の 目 的 で 使 用 す る こ と が で き る 。 フ ァ イ ル 自 身 は オ ー プ ン さ れ ず 、 他 の フ ァ イ ル 操 作 (例 え ば read (2), write (2), fchmod (2), fchown (2), fgetxattr (2), ioctl (2), mmap (2)) は エ ラ ー EBADF で 失 敗 す る 。

取 得 し た フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て 以 下 の 操 作 を 行 う こ と が 「 で き る 」 。

*

close (2).

*

fchdir (2), if the file descriptor refers to a directory (since Linux 3.5).

*

fstat (2) (Linux 3.6 以 降 ).

*

fstatfs (2) (Linux 3.12 以 降 ).

*

フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 ( dup (2), fcntl (2) F_DUPFD な ど )

*

フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ の 取 得 と 設 定 ( fcntl (2) の F_GETFD F_SETFD )

*

fcntl (2) の F_GETFL 操 作 を 使 っ た オ ー プ ン さ れ た フ ァ イ ル の 状 態 フ ラ グ の 取 得 。 返 さ れ る フ ラ グ に は O_PATH ビ ッ ト が 含 ま れ る 。

*

openat () や 他 の "*at()" 系 の シ ス テ ム コ ー ル の dirfd 引 数 と し て そ の フ ァ イ ル デ ィ ス ク リ プ タ ー を 渡 す 。 こ れ に は 、 フ ァ イ ル が デ ィ レ ク ト リ で な い 場 合 に linkat (2) に AT_EMPTY_PATH が 指 定 さ れ た 場 合 (や procfs 経 由 で AT_SYMLINK_FOLLOW が 使 用 さ れ た 場 合 ) を 含 む 。

*

そ の フ ァ イ ル デ ィ ス ク リ プ タ ー を 別 の プ ロ セ ス に UNIX ド メ イ ン ソ ケ ッ ト 経 由 で 渡 す 。 ( unix (7) の SCM_RIGHTS を 参 照 )

flags O_PATH が 指 定 さ れ た 場 合 、 O_CLOEXEC , O_DIRECTORY , O_NOFOLLOW 以 外 の フ ラ グ ビ ッ ト は 無 視 さ れ る 。

Opening a file or directory with the O_PATH flag requires no permissions on the object itself (but does require execute permission on the directories in the path prefix). Depending on the subsequent operation, a check for suitable file permissions may be performed (e.g., fchdir (2) requires execute permission on the directory referred to by its file descriptor argument). By contrast, obtaining a reference to a filesystem object by opening it with the O_RDONLY flag requires that the caller have read permission on the object, even when the subsequent operation (e.g., fchdir (2), fstat (2)) does not require read permission on the object.

pathname が シ ン ボ リ ッ ク リ ン ク で O_NOFOLLOW フ ラ グ も 合 わ せ て 指 定 さ れ た 場 合 、 こ の 呼 び 出 し で は シ ン ボ リ ッ ク リ ン ク を 参 照 す る フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 こ の フ ァ イ ル デ ィ ス ク リ プ タ ー は 、 空 の パ ス 名 を 指 定 し た fchownat (2), fstatat (2), linkat (2), readlinkat (2) の 呼 び 出 し で dirfd 引 数 と し て 使 う こ と で 、 そ の シ ン ボ リ ッ ク リ ン ク に 対 し て 操 作 を 行 う こ と が で き る 。

If pathname refers to an automount point that has not yet been triggered, so no other filesystem is mounted on it, then the call returns a file descriptor referring to the automount directory without triggering a mount. fstatfs (2) can then be used to determine if it is, in fact, an untriggered automount point ( .f_type == AUTOFS_SUPER_MAGIC ).

One use of O_PATH for regular files is to provide the equivalent of POSIX.1’s O_EXEC functionality. This permits us to open a file for which we have execute permission but not read permission, and then execute that file, with steps something like the following:

char buf[PATH_MAX];
fd = open("some_prog", O_PATH);
snprintf(buf, PATH_MAX, "/proc/self/fd/%d", fd);
execl(buf, "some_prog", (char *) NULL);

An O_PATH file descriptor can also be passed as the argument of fexecve (3).

O_SYNC

フ ァ イ ル に 対 す る 書 き 込 み 操 作 は 、 同 期 I/O の フ ァ イ ル 完 全 性 完 了 の 要 件 に 基 づ い て 行 わ れ る (こ れ に 対 し O_DSYNC で は 同 期 I/O の デ ー タ 完 全 性 完 了 が 提 供 さ れ る )。

write (2) (や 同 様 の コ ー ル ) が 返 る ま で に 、 書 き 込 ま れ た デ ー タ と 関 連 す る フ ァ イ ル メ タ デ ー タ が 裏 で 利 用 さ れ て い る ハ ー ド ウ ェ ア に 転 送 さ れ る (つ ま り 、 write (2) の 後 に fsync (2) を 呼 び 出 し た の と 同 じ よ う に な る )。 下 記 の 「 注 意 」 も 参 照 の こ と

O_TMPFILE (Linux 3.11 以 降 )

名 前 な し の 一 時 的 な 通 常 フ ァ イ ル を 作 成 す る 。 pathname 引 数 は デ ィ レ ク ト リ を 指 定 す る 。 名 前 な し の inode が そ の デ ィ レ ク ト リ が 存 在 す る フ ァ イ ル シ ス テ ム に 作 成 さ れ る 。 そ の フ ァ イ ル に 名 前 を 付 与 し な い 限 り 、 作 成 さ れ た フ ァ イ ル に 書 き 込 ま れ た 内 容 は 、 最 後 の フ ァ イ ル デ ィ ス ク リ プ タ ー が ク ロ ー ズ さ れ る 際 に 失 わ れ る 。

O_TMPFILE は 必 ず O_RDWR O_WRONLY の い ず れ か と 一 緒 に 使 わ な け れ ば な ら な い 。 O_EXCL も 指 定 す る こ と が で き る 。 O_EXCL が 指 定 さ れ な か っ た 場 合 、 linkat (2) を 使 っ て 、 そ の フ ァ イ ル シ ス テ ム に こ の 一 時 フ ァ イ ル へ の リ ン ク を 作 成 し 、 フ ァ イ ル を 永 続 化 す る こ と が で き る 。 以 下 の コ ー ド の よ う に す れ ば よ い 。

char path[PATH_MAX];
fd = open("/path/to/dir", O_TMPFILE | O_RDWR,
S_IRUSR | S_IWUSR);

/* 'fd' に 対 す る フ ァ イ ル I/O ... */

linkat(fd, NULL, AT_FDCWD, "/path/for/file", AT_EMPTY_PATH);

/* If the caller doesn't have the CAP_DAC_READ_SEARCH
capability (needed to use AT_EMPTY_PATH with linkat(2)),
and there is a proc(5) filesystem mounted, then the
linkat(2) call above can be replaced with:

snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd);
linkat(AT_FDCWD, path, AT_FDCWD, "/path/for/file",
AT_SYMLINK_FOLLOW);
*/

こ の 場 合 、 open () の mode 引 数 は O_CREAT と 同 様 に フ ァ イ ル の ア ク セ ス 許 可 モ ー ド の 決 定 に 使 わ れ る 。

O_TMPFILE と と も に O_EXCL を 指 定 す る と 、 一 時 フ ァ イ ル に 対 し て 上 記 の 方 法 で フ ァ イ ル シ ス テ ム へ の リ ン ク を 行 う こ と が で き な く な る (こ の 場 合 の O_EXCL の 意 味 は 他 の 場 合 の O_EXCL の 意 味 と は 異 な る 点 に 注 意 )。

O_TMPFILE に は 主 に 二 つ の 用 途 が あ る 。

*

改 善 さ れ た tmpfile (3) の 機 能 : (1) ク ロ ー ズ 時 に 自 動 的 に 削 除 さ れ る 、 (2) パ ス 名 で は 決 し て 参 照 で き な い 、 (3) シ ン ボ リ ッ ク リ ン ク 攻 撃 が で き な い 、 (4) 呼 び 出 し 元 が 一 意 な 名 前 を 考 え る 必 要 が な い 、 と い う 特 長 を 持 つ 競 合 の な い 一 時 フ ァ イ ル の 作 成 。

*

最 初 は 見 え な い フ ァ イ ル を 作 成 し 、 そ れ か ら デ ー タ を 書 き 込 ん だ り 、 適 切 な フ ァ イ ル シ ス テ ム 属 性 を 持 つ よ う に 調 整 し た り ( fchown (2), fchmod (2), fsetxattr (2) な ど ) し た 後 、 準 備 が 全 て 整 っ た 状 態 で (上 述 の linkat (2) を 使 っ て ) フ ァ イ ル シ ス テ ム 内 に ア ト ミ ッ ク に リ ン ク を 行 う 。

O_TMPFILE requires support by the underlying filesystem; only a subset of Linux filesystems provide that support. In the initial implementation, support was provided in the ext2, ext3, ext4, UDF, Minix, and shmem filesystems. Support for other filesystems has subsequently been added as follows: XFS (Linux 3.15); Btrfs (Linux 3.16); F2FS (Linux 3.16); and ubifs (Linux 4.9)

O_TRUNC

フ ァ イ ル が 既 に 存 在 し 、 通 常 フ ァ イ ル で あ り 、 ア ク セ ス モ ー ド で 書 き 込 み が 許 可 さ れ て い る (つ ま り 、 O_RDWR ま た は O_WRONLY の ) 場 合 、 長 さ 0 に 切 り 詰 め (truncate) ら れ る 。 フ ァ イ ル が FIFO ま た は 端 末 デ バ イ ス フ ァ イ ル の 場 合 、 O_TRUNC フ ラ グ は 無 視 さ れ る 。 そ れ 以 外 の 場 合 、 O_TRUNC の 効 果 は 未 定 義 で あ る 。

creat()

creat () の 呼 び 出 し は 、 flags O_CREAT|O_WRONLY|O_TRUNC を 指 定 し て open () を 呼 び 出 す の と 等 価 で あ る 。

openat()

openat () シ ス テ ム コ ー ル は open () と 全 く 同 様 に 動 作 す る が 、 以 下 で 説 明 す る 点 が 異 な る 。

pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 こ の パ ス 名 は フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る ( open () に 相 対 パ ス 名 を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。

pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 ( open () と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。

pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。

openat2(2)

The openat2 (2) system call is an extension of openat (), and provides a superset of the features of openat (). It is documented separately, in openat2 (2).

返 り 値

open (), openat (), and creat () return the new file descriptor (a nonnegative integer), or -1 if an error occurred (in which case, errno is set appropriately).

エ ラ ー

open (), openat (), creat () は 以 下 の エ ラ ー で 失 敗 す る 。

EACCES

フ ァ イ ル に 対 す る 要 求 さ れ た ア ク セ ス が 許 さ れ て い な い か 、 pathname の デ ィ レ ク ト リ 部 分 の 何 れ か の デ ィ レ ク ト リ に 検 索 許 可 が な か っ た 。 ま た は フ ァ イ ル が 存 在 せ ず 、 親 デ ィ レ ク ト リ へ の 書 き 込 み 許 可 が な か っ た 。 ( path_resolution (7) も 参 照 す る こ と 。 )

EACCES

Where O_CREAT is specified, the protected_fifos or protected_regular sysctl is enabled, the file already exists and is a FIFO or regular file, the owner of the file is neither the current user nor the owner of the containing directory, and the containing directory is both world- or group-writable and sticky. For details, see the descriptions of /proc/sys/fs/protected_fifos and /proc/sys/fs/protected_regular in proc (5).

EBUSY

O_EXCL was specified in flags and pathname refers to a block device that is in use by the system (e.g., it is mounted).

EDQUOT

O_CREAT が 指 定 さ れ た 場 合 で 、 そ の フ ァ イ ル が 存 在 せ ず 、 デ ィ ス ク ブ ロ ッ ク か inode が そ の フ ァ イ ル シ ス テ ム の ユ ー ザ ー ク ォ ー タ に 達 し て い た 。

EEXIST

pathname は 既 に 存 在 し 、 O_CREAT O_EXCL が 使 用 さ れ た 。

EFAULT

pathname が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し て い る 。

EFBIG

EOVERFLOW 参 照 。

EINTR

遅 い デ バ イ ス (例 え ば FIFO、 fifo (7) 参 照 ) の オ ー プ ン が 完 了 す る の を 待 っ て 停 止 し て い る 間 に シ ス テ ム コ ー ル が シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た 。 signal (7) 参 照 。

EINVAL

フ ァ イ ル シ ス テ ム が O_DIRECT フ ラ グ を サ ポ ー ト し て い な い 。 詳 細 は 注 意 を 参 照 。

EINVAL

flags に 無 効 な 値 が 入 っ て い る 。

EINVAL

flags O_TMPFILE が 指 定 さ れ た が 、 O_WRONLY O_RDWR も 指 定 さ れ て い な か っ た 。

EINVAL

O_CREAT was specified in flags and the final component ("basename") of the new file’s pathname is invalid (e.g., it contains characters not permitted by the underlying filesystem).

EINVAL

The final component ("basename") of pathname is invalid (e.g., it contains characters not permitted by the underlying filesystem).

EISDIR

pathname は デ ィ レ ク ト リ を 参 照 し て お り 、 書 き 込 み 要 求 が 含 ま れ て い た (つ ま り O_WRONLY ま た は O_RDWR が 設 定 さ れ て い る )。

EISDIR

pathname が 存 在 す る デ ィ レ ク ト リ を 参 照 し て い て 、 O_TMPFILE お よ び O_WRONLY O_RDWR の 一 方 が flags に 指 定 さ れ て い た が 、 こ の カ ー ネ ル バ ー ジ ョ ン で は O_TMPFILE 機 能 が 提 供 さ れ て い な い 。

ELOOP

pathname を 解 決 す る 際 に 遭 遇 し た シ ン ボ リ ッ ク リ ン ク が 多 過 ぎ る 。

ELOOP

pathname が シ ン ボ リ ッ ク リ ン ク で 、 flags O_NOFOLLOW が 指 定 さ れ た が 、 O_PATH が 指 定 さ れ て い な か っ た 。

EMFILE

The per-process limit on the number of open file descriptors has been reached (see the description of RLIMIT_NOFILE in getrlimit (2)).

ENAMETOOLONG

pathname が 長 過 ぎ る 。

ENFILE

オ ー プ ン さ れ て い る フ ァ イ ル の 総 数 が シ ス テ ム 全 体 の 制 限 に 達 し て い る 。

ENODEV

pathname が デ バ イ ス ス ペ シ ャ ル フ ァ イ ル を 参 照 し て お り 、 対 応 す る デ バ イ ス が 存 在 し な い 。 (こ れ は Linux カ ー ネ ル の バ グ で あ り 、 こ の 場 合 に は ENXIO が 返 さ れ る べ き で あ る )

ENOENT

O_CREAT is not set and the named file does not exist.

ENOENT

pathname の 中 の デ ィ レ ク ト リ 部 分 が 存 在 し な い か 、 壊 れ た (dangling) シ ン ボ リ ッ ク リ ン ク (symbolic link) で あ る 。

ENOENT

pathname が 存 在 し な い デ ィ レ ク ト リ を 参 照 し て い て 、 O_TMPFILE お よ び O_WRONLY O_RDWR の 一 方 が flags に 指 定 さ れ て い た が 、 こ の カ ー ネ ル バ ー ジ ョ ン で は O_TMPFILE 機 能 が 提 供 さ れ て い な い 。

ENOMEM

The named file is a FIFO, but memory for the FIFO buffer can’t be allocated because the per-user hard limit on memory allocation for pipes has been reached and the caller is not privileged; see pipe (7).

ENOMEM

十 分 な カ ー ネ ル メ モ リ ー が な い 。

ENOSPC

pathname を 作 成 す る 必 要 が あ る が 、 pathname を 含 ん で い る デ バ イ ス に 新 し い フ ァ イ ル の た め の 空 き 容 量 が な い 。

ENOTDIR

pathname に 含 ま れ る デ ィ レ ク ト リ 部 分 の ど れ か が 実 際 に は デ ィ レ ク ト リ で な い 。 ま た は O_DIRECTORY が 指 定 さ れ て お り 、 pathname が デ ィ レ ク ト リ で な い 。

ENXIO

O_NONBLOCK | O_WRONLY が 設 定 さ れ て お り 、 指 定 し た フ ァ イ ル が FIFO で そ の フ ァ イ ル を 読 み 込 み 用 で オ ー プ ン し て い る FIFO が 存 在 し な い 。

ENXIO

フ ァ イ ル が デ バ イ ス ス ペ シ ャ ル フ ァ イ ル で 、 対 応 す る デ バ イ ス が 存 在 し な い 。

ENXIO

The file is a UNIX domain socket.

EOPNOTSUPP

pathname を 含 ん で い る フ ァ イ ル シ ス テ ム が O_TMPFILE を サ ポ ー ト し て い な い 。

EOVERFLOW

pathname が 参 照 し て い る の が 、 大 き 過 ぎ て オ ー プ ン で き な い 通 常 の フ ァ イ ル で あ る 。 通 常 、 こ の エ ラ ー が 発 生 す る は 、 32 ビ ッ ト プ ラ ッ ト フ ォ ー ム 上 で -D_FILE_OFFSET_BITS=64 を 指 定 せ ず に コ ン パ イ ル さ れ た ア プ リ ケ ー シ ョ ン が 、 フ ァ イ ル サ イ ズ が (1<31)-1 バ イ ト を 超 え る フ ァ イ ル を 開 こ う と し た 場 合 で あ る 。 上 記 の O_LARGEFILE も 参 照 。 こ れ は POSIX.1 で 規 定 さ れ て い る エ ラ ー で あ る 。 2.6.24 よ り 前 の カ ー ネ ル で は 、 Linux は こ の 場 合 に エ ラ ー EFBIG を 返 し て い た 。

EPERM

O_NOATIME フ ラ グ が 指 定 さ れ た が 、 呼 び 出 し 元 の 実 効 ユ ー ザ ー ID が フ ァ イ ル の 所 有 者 と 一 致 せ ず 、 か つ 呼 び 出 し 元 に 特 権 が な い 。

EPERM

操 作 が file seal に よ り 禁 止 さ れ て い る 。 fcntl (2) 参 照 。

EROFS

pathname が 読 み 込 み 専 用 の フ ァ イ ル シ ス テ ム 上 の フ ァ イ ル を 参 照 し て お り 、 書 き 込 み ア ク セ ス が 要 求 さ れ た 。

ETXTBSY

pathname が 現 在 実 行 中 の 実 行 イ メ ー ジ を 参 照 し て お り 、 書 き 込 み が 要 求 さ れ た 。

ETXTBSY

pathname refers to a file that is currently in use as a swap file, and the O_TRUNC flag was specified.

ETXTBSY

pathname refers to a file that is currently being read by the kernel (e.g., for module/firmware loading), and write access was requested.

EWOULDBLOCK

O_NONBLOCK フ ラ グ が 指 定 さ れ た が 、 そ の フ ァ イ ル に は 矛 盾 す る リ ー ス が 設 定 さ れ て い た ( fcntl (2) 参 照 )。

openat () で は 以 下 の エ ラ ー も 発 生 す る 。

EBADF

dirfd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で は な い 。

ENOTDIR

pathname が 相 対 パ ス 名 で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。

バ ー ジ ョ ン

openat () は カ ー ネ ル 2.6.16 で Linux に 追 加 さ れ た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は バ ー ジ ョ ン 2.4 で glibc に 追 加 さ れ た 。

準 拠

open (), creat () SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

openat (): POSIX.1-2008.

openat2 () は Linux 固 有 で あ る 。

フ ラ グ O_DIRECT , O_NOATIME , O_PATH , O_TMPFILE は Linux 特 有 の も の で あ る 。 こ れ ら の フ ラ グ の 定 義 を 得 る た め に は _GNU_SOURCE を 定 義 し な け れ ば な ら な い 。

フ ラ グ O_CLOEXEC , O_DIRECTORY , O_NOFOLLOW は POSIX.1-2001 で は 規 定 さ れ て い な い が 、 POSIX.1-2008 で は 規 定 さ れ て い る 。 glibc 2.12 以 降 で は 、 こ れ ら の 定 義 を 得 る に は 、 _POSIX_C_SOURCE を 200809L 以 上 の 値 で 定 義 す る か 、 _XOPEN_SOURCE を 700 以 上 の 値 で 定 義 す る 。 glibc 2.11 以 前 で は 、 こ れ ら の 定 義 を 得 る に は _GNU_SOURCE を 定 義 す る 。

feature_test_macros (7) に 注 意 書 き が あ る よ う に 、 _POSIX_C_SOURCE , _XOPEN_SOURCE , _GNU_SOURCE な ど の 機 能 検 査 マ ク ロ は ど の ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り 前 に 定 義 し な け れ ば な ら な い 。

注 意

Under Linux, the O_NONBLOCK flag is sometimes used in cases where one wants to open but does not necessarily have the intention to read or write. For example, this may be used to open a device in order to get a file descriptor for use with ioctl (2).

O_RDONLY | O_TRUNC の 影 響 は 未 定 義 で あ り 、 そ の 動 作 は 実 装 に よ っ て 異 な る 。 多 く の シ ス テ ム で は フ ァ イ ル は 実 際 に 切 り 詰 め ら れ る 。

open () は ス ペ シ ャ ル フ ァ イ ル を オ ー プ ン す る こ と が で き る が 、 creat () で ス ペ シ ャ ル フ ァ イ ル を 作 成 で き な い 点 に 注 意 す る こ と 。 代 わ り に mknod (2) を 使 用 す る 。

フ ァ イ ル が 新 し く 作 成 さ れ る と 、 フ ァ イ ル の st_atime , st_ctime , st_mtime フ ィ ー ル ド (そ れ ぞ れ 最 終 ア ク セ ス 時 刻 、 最 終 状 態 変 更 時 刻 、 最 終 修 正 時 刻 で あ る 。 stat (2) 参 照 ) が 現 在 時 刻 に 設 定 さ れ る 。 さ ら に 親 デ ィ レ ク ト リ の st_ctime st_mtime も 現 在 時 刻 に 設 定 さ れ る 。 そ れ 以 外 の 場 合 で 、 O_TRUNC フ ラ グ で フ ァ イ ル が 修 正 さ れ た と き は 、 フ ァ イ ル の st_ctime st_mtime フ ィ ー ル ド が 現 在 時 刻 に 設 定 さ れ る 。

The files in the /proc/[pid]/fd directory show the open file descriptors of the process with the PID pid . The files in the /proc/[pid]/fdinfo directory show even more information about these file descriptors. See proc (5) for further details of both of these directories.

The Linux header file <asm/fcntl.h> doesn’t define O_ASYNC ; the (BSD-derived) FASYNC synonym is defined instead.

オ ー プ ン フ ァ イ ル 記 述

オ ー プ ン フ ァ イ ル 記 述 と い う 用 語 は POSIX で 使 用 さ れ て い る 用 語 で 、 オ ー プ ン さ れ て い る フ ァ イ ル の シ ス テ ム 共 通 の テ ー ブ ル の エ ン ト リ ー を 参 照 す る も の で あ る 。 別 の 文 脈 で は 、 こ の オ ブ ジ ェ ク ト は い ろ い ろ な 呼 び 方 が あ り 、 「 オ ー プ ン フ ァ イ ル オ ブ ジ ェ ク ト 」 、 「 フ ァ イ ル ハ ン ド ル 」 、 「 オ ー プ ン フ ァ イ ル テ ー ブ ル エ ン ト リ ー 」 、 カ ー ネ ル 開 発 者 の 用 語 で は struct file な ど と 呼 ば れ る 。

フ ァ イ ル デ ィ ス ク リ プ タ ー が ( dup (2) や 同 様 の シ ス テ ム コ ー ル を 使 っ て ) 複 製 さ れ る 際 に 、 複 製 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー は 元 の フ ァ イ ル デ ィ ス ク リ プ タ ー と 同 じ オ ー プ ン フ ァ イ ル 記 述 を 参 照 す る 。 結 果 と し て 2 つ の フ ァ イ ル デ ィ ス ク リ プ タ ー は フ ァ イ ル オ フ セ ッ ト と フ ァ イ ル 状 態 フ ラ グ を 共 有 す る 。 こ の よ う な 共 有 は プ ロ セ ス 間 で も 起 こ り 得 る 。 fork (2) で 作 成 さ れ た 子 プ ロ セ ス は 親 プ ロ セ ス の フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 を 継 承 し 、 こ れ ら の 複 製 は 同 じ オ ー プ ン フ ァ イ ル 記 述 を 参 照 す る 。

1 つ の フ ァ イ ル に 対 し て open () を 行 う 毎 に 、 新 し い オ ー プ ン フ ァ イ ル 記 述 が 作 成 さ れ る 。 し た が っ て 、 1 つ の フ ァ イ ル inode に 対 し て 複 数 の オ ー プ ン フ ァ イ ル 記 述 が 存 在 す る こ と が あ り え る 。

On Linux, one can use the kcmp (2) KCMP_FILE operation to test whether two file descriptors (in the same process or in two different processes) refer to the same open file description.

同 期 I/O

POSIX.1-2008 の 「 同 期 I/O」 の 選 択 肢 と し て 複 数 種 類 が 規 定 さ れ て お り 、 動 作 を 制 御 す る た め に open () フ ラ グ と し て O_SYNC , O_DSYNC , O_RSYNC が 規 定 さ れ て い る 。 こ の 選 択 肢 を 実 装 が サ ポ ー ト し て い る か に 関 わ ら ず 、 各 実 装 で は 少 な く と も 通 常 の フ ァ イ ル に 対 し て O_SYNC が 利 用 で き な け れ ば な ら な い 。

Linux implements O_SYNC and O_DSYNC , but not O_RSYNC . Somewhat incorrectly, glibc defines O_RSYNC to have the same value as O_SYNC . ( O_RSYNC is defined in the Linux header file <asm/fcntl.h> on HP PA-RISC, but it is not used.)

O_SYNC は 、 同 期 I/O で の フ ァ イ ル 完 全 性 完 了 を 提 供 す る 。 つ ま り 、 書 き 込 み 操 作 は デ ー タ と す べ て の 関 連 メ タ デ ー タ を 裏 で 利 用 さ れ て い る ハ ー ド ウ ェ ア に フ ラ ッ シ ュ す る こ と を 意 味 す る 。 O_DSYNC は 、 同 期 I/O で の デ ー タ 完 全 性 完 了 を 提 供 す る 。 つ ま り 、 書 き 込 み 操 作 は デ ー タ を 裏 で 利 用 さ れ て い る ハ ー ド ウ ェ ア に フ ラ ッ シ ュ す る が 、 そ れ 以 降 の 読 み 出 し 操 作 が 正 常 に 完 了 す る の に 必 要 な メ タ デ ー タ の 更 新 の み を フ ラ ッ シ ュ す る 。 デ ー タ 完 全 性 完 了 は 、 フ ァ イ ル 完 全 性 完 了 を 必 要 と し な い ア プ リ ケ ー シ ョ ン で 、 デ ィ ス ク 操 作 の 数 を 減 ら す こ と が で き る 。

2 種 類 の 完 了 の 違 い を 理 解 す る た め に 、 フ ァ イ ル メ タ デ ー タ の 2 つ の 要 素 、 フ ァ イ ル の 最 終 修 正 時 刻 ( st_mtime ) と フ ァ イ ル 長 、 を 考 え る 。 す べ て の 書 き 込 み 操 作 は 最 終 修 正 時 刻 を 更 新 す る が 、 フ ァ イ ル の 末 尾 に デ ー タ を 追 加 す る 書 き 込 み 操 作 の み が フ ァ イ ル 長 を 変 更 す る 。 最 終 修 正 時 刻 は 、 読 み 出 し が 正 常 に 完 了 す る の に 必 要 で は な い が 、 フ ァ イ ル 長 は 必 要 で あ る 。 し た が っ て 、 O_DSYNC は フ ァ イ ル 長 の メ タ デ ー タ の 更 新 が フ ラ ッ シ ュ さ れ る こ と だ け を 保 証 す る (こ れ に 対 し て O_SYNC で は 最 終 修 正 時 刻 の メ タ デ ー タ も 常 に フ ラ ッ シ ュ さ れ る )。

Linux 2.6.33 よ り 前 で は 、 Linux は open () で は O_SYNC フ ラ グ の み を 実 装 し て い た 。 し か し な が ら 、 こ の フ ラ グ が 指 定 さ れ た 場 合 、 ほ と ん ど の フ ァ イ ル シ ス テ ム で 提 供 さ れ て い た の は 実 際 に は 同 期 I/O で の デ ー タ 完 全 性 完 了 と 等 価 な も の で あ っ た (つ ま り 、 O_SYNC は 実 際 に は O_DSYNC と 等 価 な も の と し て 実 装 さ れ て い た )。

Linux 2.6.33 以 降 で は 、 正 し い O_SYNC の サ ポ ー ト が 提 供 さ れ て い る 。 し か し な が ら 、 バ イ ナ リ レ ベ ル の 後 方 互 換 性 を 保 証 す る た め 、 O_DSYNC は 以 前 の O_SYNC と 同 じ 値 で 定 義 さ れ て お り 、 O_SYNC O_DSYNC フ ラ グ の 値 を 含 む 新 し い (2 ビ ッ ト の ) フ ラ グ 値 と し て 定 義 さ れ て い る 。 こ れ に よ り 、 新 し い ヘ ッ ダ ー を 使 っ て コ ン パ イ ル さ れ た ア プ リ ケ ー シ ョ ン で 、 2.6.33 よ り 前 の カ ー ネ ル で 少 な く と も O_DSYNC の 動 作 は 同 じ に な る こ と が 保 証 さ れ る 。

C ラ イ ブ ラ リ と カ ー ネ ル の 違 い

Since version 2.26, the glibc wrapper function for open () employs the openat () system call, rather than the kernel’s open () system call. For certain architectures, this is also true in glibc versions before 2.26.

NFS

NFS を 実 現 し て い る プ ロ ト コ ル に は 多 く の 不 備 が あ り 、 特 に O_SYNC O_NDELAY に 影 響 す る 。

UID マ ッ ピ ン グ を 使 用 し て い る NFS フ ァ イ ル シ ス テ ム で は 、 open () が フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 し た 場 合 で も read (2) が EACCES で 拒 否 さ れ る 場 合 が あ る 。 こ れ は ク ラ イ ア ン ト が ア ク セ ス 許 可 の チ ェ ッ ク を 行 っ て open () を 実 行 す る が 、 読 み 込 み や 書 き 込 み の 際 に は サ ー バ ー で UID マ ッ ピ ン グ が 行 わ れ る た め で あ る 。

FIFOs

Opening the read or write end of a FIFO blocks until the other end is also opened (by another process or thread). See fifo (7) for further details.

フ ァ イ ル ア ク セ ス モ ー ド

「 ア ク セ ス モ ー ド 」 の 値 O_RDONLY , O_WRONLY , O_RDWR は 、 flags に 指 定 で き る 他 の 値 と 違 い 、 個 々 の ビ ッ ト を 指 定 す る も の で は な く 、 こ れ ら の 値 は flags の 下 位 2 ビ ッ ト を 定 義 す る 。 O_RDONLY , O_WRONLY , O_RDWR は そ れ ぞ れ 0, 1, 2 に 定 義 さ れ て い る 。 言 い 換 え る と 、 O_RDONLY | O_WRONLY の 組 み 合 わ せ は 論 理 的 に 間 違 い で あ り 、 確 か に O_RDWR と 同 じ 意 味 で は な い 。

Linux で は 、 特 別 な 、 非 標 準 な ア ク セ ス モ ー ド と し て 3 (バ イ ナ リ で は 11) が 予 約 さ れ て お り flags に 指 定 で き る 。 こ の ア ク セ ス モ ー ド を 指 定 す る と 、 フ ァ イ ル の 読 み 出 し /書 き 込 み 許 可 を チ ェ ッ ク し 、 読 み 出 し に も 書 き 込 み に も 使 用 で き な い フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 こ の 非 標 準 の ア ク セ ス モ ー ド は い く つ か の Linux ド ラ イ バ で 、 デ バ イ ス 固 有 の ioctl (2) 操 作 に の み 使 用 さ れ る フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す た め に 使 わ れ て い る 。

openat() や 他 の デ ィ レ ク ト リ フ ァ イ ル デ ィ ス ク リ プ タ ー API の 基 本 原 理

openat () and the other system calls and library functions that take a directory file descriptor argument (i.e., execveat (2), faccessat (2), fanotify_mark (2), fchmodat (2), fchownat (2), fspick (2), fstatat (2), futimesat (2), linkat (2), mkdirat (2), move_mount (2), mknodat (2), name_to_handle_at (2), open_tree (2), openat2 (2), readlinkat (2), renameat (2), statx (2), symlinkat (2), unlinkat (2), utimensat (2), mkfifoat (3), and scandirat (3)) address two problems with the older interfaces that preceded them. Here, the explanation is in terms of the openat () call, but the rationale is analogous for the other interfaces.

First, openat () allows an application to avoid race conditions that could occur when using open () to open files in directories other than the current working directory. These race conditions result from the fact that some component of the directory prefix given to open () could be changed in parallel with the call to open (). Suppose, for example, that we wish to create the file dir1/dir2/xxx.dep if the file dir1/dir2/xxx exists. The problem is that between the existence check and the file-creation step, dir1 or dir2 (which might be symbolic links) could be modified to point to a different location. Such races can be avoided by opening a file descriptor for the target directory, and then specifying that file descriptor as the dirfd argument of (say) fstatat (2) and openat (). The use of the dirfd file descriptor also has other benefits:

*

the file descriptor is a stable reference to the directory, even if the directory is renamed; and

*

the open file descriptor prevents the underlying filesystem from being dismounted, just as when a process has a current working directory on a filesystem.

二 つ 目 と し て 、 openat () を 使 う と 、 ア プ リ ケ ー シ ョ ン が 管 理 す る フ ァ イ ル デ ィ ス ク リ プ タ ー に よ り 、 ス レ ッ ド 単 位 の 「 カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ 」 を 実 装 す る こ と が で き る (こ の 機 能 は 、 /proc/self/fd/dirfd を 使 っ た 方 法 で も 実 現 す る こ と が で き る が 、 効 率 の 面 で 落 と る )。

The dirfd argument for these APIs can be obtained by using open () or openat () to open a directory (with either the O_RDONLY or the O_PATH flag). Alternatively, such a file descriptor can be obtained by applying dirfd (3) to a directory stream created using opendir (3).

When these APIs are given a dirfd argument of AT_FDCWD or the specified pathname is absolute, then they handle their pathname argument in the same way as the corresponding conventional APIs. However, in this case, several of the APIs have a flags argument that provides access to functionality that is not available with the corresponding conventional APIs.

O_DIRECT

O_DIRECT フ ラ グ を 使 用 す る 場 合 、 ユ ー ザ ー 空 間 バ ッ フ ァ ー の 長 さ や ア ド レ ス 、 I/O の フ ァ イ ル オ フ セ ッ ト に 関 し て ア ラ イ ン メ ン ト の 制 限 が 課 さ れ る こ と が あ る 。 Linux で は 、 ア ラ イ ン メ ン ト の 制 限 は フ ァ イ ル シ ス テ ム や カ ー ネ ル の バ ー ジ ョ ン に よ っ て 異 な り 、 全 く 制 限 が 存 在 し な い 場 合 も あ る 。 し か し な が ら 、 現 在 の と こ ろ 、 指 定 さ れ た フ ァ イ ル や フ ァ イ ル シ ス テ ム に 対 し て こ う し た 制 限 が あ る か を 見 つ け る た め の 、 ア プ リ ケ ー シ ョ ン 向 け の イ ン タ ー フ ェ ー ス で フ ァ イ ル シ ス テ ム 非 依 存 の も の は 存 在 し な い 。 い く つ か の フ ァ イ ル シ ス テ ム で は 、 制 限 を 確 認 す る た め の 独 自 の イ ン タ ー フ ェ ー ス が 提 供 さ れ て い る 。 例 え ば 、 xfsctl (3) の XFS_IOC_DIOINFO 命 令 で あ る 。

Linux 2.4 で は 、 転 送 サ イ ズ 、 ユ ー ザ ー バ ッ フ ァ ー の ア ラ イ メ ン ト 、 フ ァ イ ル オ フ セ ッ ト は 、 フ ァ イ ル シ ス テ ム の 論 理 ブ ロ ッ ク サ イ ズ の 倍 数 で な け れ ば な ら な い 。 Linux 2.6.0 以 降 で は 、 内 部 で 使 わ れ る ス ト レ ー ジ の 論 理 ブ ロ ッ ク サ イ ズ の ア ラ イ メ ン ト (通 常 は 512 バ イ ト ) で 十 分 で あ る 。 論 理 ブ ロ ッ ク サ イ ズ は ioctl (2) BLKSSZGET 操 作 や 以 下 の シ ェ ル コ マ ン ド か ら 知 る こ と が で き る 。

blockdev --getss

メ モ リ ー バ ッ フ ァ ー が プ ラ イ ベ ー ト マ ッ ピ ン グ ( mmap (2) の MAP_PRIVATE フ ラ グ で 作 成 さ れ た マ ッ ピ ン グ ) の 場 合 に は 、 O_DIRECT I/O は fork (2) シ ス テ ム コ ー ル と 同 時 に 決 し て 実 行 す べ き で は な い (プ ラ イ ベ ー ト マ ッ ピ ン グ に は 、 ヒ ー プ 領 域 に 割 り 当 て ら れ た メ モ リ ー や 静 的 に 割 り 当 て た バ ッ フ ァ ー も 含 ま れ る )。 非 同 期 I/O イ ン タ ー フ ェ ー ス (AIO) 経 由 や プ ロ セ ス 内 の 他 の ス レ ッ ド か ら 発 行 さ れ た 、 こ の よ う な I/O は 、 fork (2) が 呼 び 出 さ れ る 前 に 完 了 さ れ る べ き で あ る 。 そ う し な か っ た 場 合 、 デ ー タ 破 壊 や 、 親 プ ロ セ ス や 子 プ ロ セ ス で の 予 期 し な い 動 作 が 起 こ る 可 能 性 が あ る 。 O_DIRECT I/O 用 の メ モ リ ー バ ッ フ ァ ー が shmat (2) や MAP_SHARED フ ラ グ 付 き の mmap (2) で 作 成 さ れ た 場 合 に は 、 こ の 制 限 は あ て は ま ら な い 。 madvise (2) で メ モ リ ー バ ッ フ ァ ー に ア ド バ イ ス MADV_DONTFORK が 設 定 さ れ て い る 場 合 に も 、 こ の 制 限 は あ て は ま ら な い ( MADV_DONTFORK は そ の メ モ リ ー バ ッ フ ァ ー が fork (2) 後 に 子 プ ロ セ ス か ら は 利 用 で き な い こ と を 保 証 す る も の で あ る )。

O_DIRECT フ ラ グ は SGI IRIX で 導 入 さ れ た 。 SGI IRIX に も Linux 2.4 と 同 様 の (ユ ー ザ ー バ ッ フ ァ ー の ) ア ラ イ ン メ ン ト の 制 限 が あ る 。 ま た 、 IRIX に は 適 切 な 配 置 と サ イ ズ を 取 得 す る た め の fcntl (2) コ ー ル が あ る 。 FreeBSD 4.x も 同 じ 名 前 の フ ラ グ を 導 入 し た が 、 ア ラ イ ン メ ン ト の 制 限 は な い 。

O_DIRECT support was added under Linux in kernel version 2.4.10. Older Linux kernels simply ignore this flag. Some filesystems may not implement the flag, in which case open () fails with the error EINVAL if it is used.

ア プ リ ケ ー シ ョ ン は 、 同 じ フ ァ イ ル 、 特 に 同 じ フ ァ イ ル の 重 複 す る バ イ ト 領 域 に 対 し て 、 O_DIRECT と 通 常 の I/O を 混 ぜ て 使 う の は 避 け る べ き で あ る 。 フ ァ イ ル シ ス テ ム が こ の よ う な 状 況 に お い て 一 貫 性 の 問 題 を 正 し く 扱 う こ と が で き る 場 合 で あ っ て も 、 全 体 の I/O ス ル ー プ ッ ト は ど ち ら か 一 方 を 使 用 す る と き と 比 べ て 低 速 に な る で あ ろ う 。 同 様 に 、 ア プ リ ケ ー シ ョ ン は 、 同 じ フ ァ イ ル に 対 し て mmap (2) と 直 接 I/O ( O_DIRECT ) を 混 ぜ て 使 う の も 避 け る べ き で あ る 。

NFS で O_DIRECT を 使 っ た 場 合 の 動 作 は ロ ー カ ル の フ ァ イ ル シ ス テ ム の 場 合 と 違 う 。 古 い カ ー ネ ル や 、 あ る 種 の 設 定 で コ ン パ イ ル さ れ た カ ー ネ ル は 、 O_DIRECT と NFS の 組 み 合 わ せ を サ ポ ー ト し て い な い か も し れ な い 。 NFS プ ロ ト コ ル 自 体 は サ ー バ に フ ラ グ を 渡 す 機 能 は 持 っ て い な い の で 、 O_DIRECT I/O は ク ラ イ ア ン ト 上 の ペ ー ジ キ ャ ッ シ ュ を バ イ パ ス す る だ け に な り 、 サ ー バ は I/O を キ ャ ッ シ ュ し て い る か も し れ な い 。 ク ラ イ ア ン ト は 、 O_DIRECT の 同 期 機 構 を 保 持 す る た め 、 サ ー バ に 対 し て I/O を 同 期 し て 行 う よ う に 依 頼 す る 。 サ ー バ に よ っ て は 、 こ う し た 状 況 下 、 特 に I/O サ イ ズ が 小 さ い 場 合 に 性 能 が 大 き く 劣 化 す る 。 ま た 、 サ ー バ に よ っ て は 、 I/O が 安 定 し た ス ト レ ー ジ に ま で 行 わ れ た と 、 ク ラ イ ア ン ト に 対 し て 嘘 を つ く も の も あ る 。 こ れ は 、 サ ー バ の 電 源 故 障 が 起 こ っ た 際 に デ ー タ の 完 全 性 が 保 た れ な い 危 険 は 少 し あ る が 、 性 能 面 で の 不 利 な 条 件 を 回 避 す る た め に 行 わ れ て い る 。 Linux の NFS ク ラ イ ア ン ト で は O_DIRECT I/O で の ア ラ イ ン メ ン ト の 制 限 は な い 。

ま と め る と 、 O_DIRECT は 、 注 意 し て 使 う べ き で あ る が 、 強 力 な ツ ー ル と な る 可 能 性 を 持 っ て い る 。 ア プ リ ケ ー シ ョ ン は O_DIRECT を デ フ ォ ル ト で は 無 効 に な っ て い る 性 能 向 上 の た め の オ プ シ ョ ン と 考 え て お く の が よ い で あ ろ う 。

バ グ

現 在 の と こ ろ 、 open () の 呼 び 出 し 時 に O_ASYNC を 指 定 し て シ グ ナ ル 駆 動 I/O を 有 効 に す る こ と は で き な い 。 こ の フ ラ グ を 有 効 に す る に は fcntl (2) を 使 用 す る こ と 。

カ ー ネ ル が O_TMPFILE 機 能 を サ ポ ー ト し て い る か を 判 定 す る 際 に 、 EISDIR ENOENT の 2 つ の エ ラ ー コ ー ド を チ ェ ッ ク し な け れ ば な ら な い 。

When both O_CREAT and O_DIRECTORY are specified in flags and the file specified by pathname does not exist, open () will create a regular file (i.e., O_DIRECTORY is ignored).

関 連 項 目

chmod (2), chown (2), close (2), dup (2), fcntl (2), link (2), lseek (2), mknod (2), mmap (2), mount (2), open_by_handle_at (2), openat2 (2), read (2), socket (2), stat (2), umask (2), unlink (2), write (2), fopen (3), acl (5), fifo (7), inode (7), path_resolution (7), symlink (7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。