Manpages

名 前

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);

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

openat():

glibc 2.10 以 降 :

_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L

glibc 2.10 よ り 前 :

_ATFILE_SOURCE

説 明

フ ァ イ ル の pathname を 与 え る と 、 open() は フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 フ ァ イ ル デ ィ ス ク リ プ タ ー は 、 こ の 後 に 続 く シ ス テ ム コ ー ル (read(2), write(2), lseek(2), fcntl(2) な ど ) で 使 用 さ れ る 小 さ な 非 負 の 整 数 で あ る 。 こ の シ ス テ ム コ ー ル が 成 功 し た 場 合 に 返 さ れ る フ ァ イ ル デ ィ ス ク リ プ タ ー は そ の プ ロ セ ス が そ の 時 点 で オ ー プ ン し て い な い フ ァ イ ル デ ィ ス ク リ プ タ ー の う ち 最 小 の 数 字 の も の と な る 。 デ フ ォ ル ト で は 、 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー は execve(2) を 実 行 し た 後 も オ ー プ ン さ れ た ま ま と な る (つ ま り 、 fcntl(2) に 説 明 が あ る FD_CLOEXEC フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ は 最 初 は 無 効 で あ る ); 後 述 の O_CLOEXEC フ ラ グ を 使 う と こ の デ フ ォ ル ト を 変 更 す る こ と が で き る 。 フ ァ イ ル オ フ セ ッ ト (file offset) は フ ァ イ ル の 先 頭 に 設 定 さ れ る (lseek(2) 参 照 )。

open() を 呼 び 出 す と 、 「 オ ー プ ン フ ァ イ ル 記 述 」 (open file description) が 作 成 さ れ る 。 フ ァ イ ル 記 述 と は 、 シ ス テ ム 全 体 の オ ー プ ン 中 の フ ァ イ ル の テ ー ブ ル の エ ン ト リ ー で あ る 。 こ の オ ー プ ン フ ァ イ ル 記 述 は 、 フ ァ イ ル オ フ セ ッ ト と フ ァ イ ル 状 態 フ ラ グ (下 記 参 照 ) が 保 持 す る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー は オ ー プ ン フ ァ イ ル っ 記 述 へ の 参 照 で あ る 。 こ の 後 で pathname が 削 除 さ れ た り 、 他 の フ ァ イ ル を 参 照 す る よ う に 変 更 さ れ た り し て も 、 こ の 参 照 は 影 響 を 受 け な い 。 オ ー プ ン フ ァ イ ル 記 述 の 詳 細 な 説 明 は 「 注 意 」 の 節 を 参 照 。 引 き 数 flags に は 、 ア ク セ ス モ ー ド O_RDONLY, O_WRONLY, O_RDWR の ど れ か ひ と つ が 入 っ て い な け れ ば な ら な い 。 こ れ ら は そ れ ぞ れ 読 み 込 み 専 用 、 書 き 込 み 専 用 、 読 み 書 き 用 に フ ァ イ ル を オ ー プ ン す る こ と を 要 求 す る も の で あ る 。 さ ら に 、 flags に は 、 フ ァ イ ル 作 成 フ ラ グ (file creation flag) と フ ァ イ ル 状 態 フ ラ グ (file status flag) を 0 個 以 上 「 ビ ッ ト 単 位 の OR (bitwise−or)」 で 指 定 す る こ と が で き る 。 フ ァ イ ル 作 成 フ ラ グO_CLOEXEC, O_CREAT, O_DIRECTORY, O_EXCL, O_NOCTTY, O_NOFOLLOW, O_TMPFILE, O_TRUNC, O_TTY_INIT で あ る 。 フ ァ イ ル 状 態 フ ラ グ は 以 下 の リ ス ト の う ち 上 記 以 外 の 残 り の も の で あ る 。 二 種 類 の フ ラ グ の 違 い は 、 フ ァ イ ル 状 態 フ ラ グ の 方 は そ の 内 容 を 取 得 し た り (場 合 に よ っ て は ) 変 更 し た り で き る 点 に あ る 。 詳 細 は fcntl(2) を 参 照 。 す べ て の フ ァ イ ル 作 成 フ ラ グ と フ ァ イ ル 状 態 フ ラ グ を 以 下 の リ ス ト に 示 す 。
O_APPEND
フ ァ イ ル を 追 加 (append) モ ー ド で オ ー プ ン す る 。 毎 回 の write(2) の 前 に lseek(2) を 行 っ た か の よ う に 、 フ ァ イ ル ポ イ ン タ ー を フ ァ イ ル の 最 後 に 移 動 す る 。 NFS フ ァ イ ル シ ス テ ム で 、 O_APPEND を 使 用 す る と 、 複 数 の プ ロ セ ス が ひ と つ の フ ァ イ ル に 同 時 に デ ー タ を 追 加 し た 場 合 、 フ ァ イ ル が 壊 れ て し ま う こ と が あ る 。 こ れ は NFS が 追 加 モ ー ド を サ ポ ー ト し て い な い た め 、 ク ラ イ ア ン ト の カ ー ネ ル (kernel) が そ れ を シ ミ ュ レ ー ト し な け れ ば な ら な い の だ が 、 競 合 状 態 を 避 け る こ と は で き な い か ら で あ る 。
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
フ ァ イ ル が 存 在 し な か っ た 場 合 は 作 成 (create) す る 。 フ ァ イ ル の 所 有 者 (ユ ー ザ ー ID) は 、 プ ロ セ ス の 実 効 ユ ー ザ ー ID に 設 定 さ れ る 。 グ ル ー プ 所 有 権 (グ ル ー プ ID) は 、 プ ロ セ ス の 実 効 グ ル ー プ ID ま た は 親 デ ィ レ ク ト リ の グ ル ー プ ID に 設 定 さ れ る (こ れ は 、 フ ァ イ ル シ ス テ ム タ イ プ 、 マ ウ ン ト オ プ シ ョ ン 、 親 デ ィ レ ク ト リ の モ ー ド に 依 存 す る 。 mount(8) で 説 明 さ れ て い る マ ウ ン ト オ プ シ ョ ン bsdgroupssysvgroups を 参 照 )。

mode は 新 し い フ ァ イ ル を 作 成 す る 場 合 に 使 用 す る ア ク セ ス 許 可 (permission) を 指 定 す る 。 flagsO_CREATO_TMPFILE が 指 定 さ れ て い る 場 合 、 mode を 指 定 し な け れ ば な ら な い 。 O_CREATO_TMPFILE も 指 定 さ れ て い な い 場 合 、 mode は 無 視 さ れ る 。 有 効 な ア ク セ ス 許 可 は 、 普 段 と 同 じ よ う に プ ロ セ ス の umask に よ っ て 修 正 さ れ 、 作 成 さ れ た フ ァ イ ル の 許 可 は (mode & ~umask) と な る 。 こ の モ ー ド は 、 新 し く 作 成 さ れ た フ ァ イ ル に 対 す る そ れ 以 降 の ア ク セ ス に の み 適 用 さ れ る 点 に 注 意 す る こ と 。 読 み 取 り 専 用 の フ ァ イ ル を 作 成 す る open() コ ー ル で あ っ て も 、 読 み 書 き 可 能 な フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す こ と が あ り う る 。

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 他 人 に 実 行 の 許 可 が あ る 。

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() は 失 敗 す る 。 こ れ ら 二 つ の フ ラ グ が 指 定 さ れ た 際 、 シ ン ボ リ ッ ク リ ン ク は 辿 ら れ な い 。 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 以 降 ) フ ァ イ ル に 対 し て read(2) が 実 行 さ れ た と き に 、 最 終 ア ク セ ス 時 刻 (inode の st_atime) を 更 新 し な い 。 こ の フ ラ グ は イ ン デ ッ ク ス 作 成 や バ ッ ク ア ッ プ プ ロ グ ラ ム で 使 う こ と を 意 図 し て い る 。 こ れ を 使 う と デ ィ ス ク に 対 す る 操 作 を 大 幅 に 減 ら す こ と が で き る 。 こ の フ ラ グ は 全 て の フ ァ イ ル シ ス テ ム に 対 し て 有 効 で あ る わ け で は な い 。 そ の 一 例 が NFS で あ り 、 サ ー バ が ア ク セ ス 時 刻 を 管 理 し て い る 。
O_NOCTTY

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

O_NOFOLLOW

pathname が シ ン ボ リ ッ ク リ ン ク だ っ た 場 合 、 オ ー プ ン は 失 敗 す る 。 こ れ は FreeBSD の 拡 張 で 、 Linux に は バ ー ジ ョ ン 2.1.126 で 追 加 さ れ た 。 こ の フ ラ グ が 指 定 さ れ た 場 合 で も pathname の 前 の 方 の 要 素 (最 後 の デ ィ レ ク ト リ セ パ レ ー タ よ り 前 の 部 分 ) に あ る シ ン ボ リ ッ ク リ ン ク に つ い て は リ ン ク が 辿 ら れ る 。 下 記 の O_PATH も 参 照 の こ と 。

O_NONBLOCK ま た は O_NDELAY 可 能 な ら ば 、 フ ァ イ ル は 非 停 止 (nonblocking) モ ー ド で オ ー プ ン さ れ る 。 open() も 、 返 し た フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 す る 以 後 の す べ て の 操 作 も 呼 び 出 し た プ ロ セ ス を 待 た せ る こ と は な い 。 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), mmap(2)) は エ ラ ー EBADF で 失 敗 す る 。 取 得 し た フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て 以 下 の 操 作 を 行 う こ と が 「 で き る 」 。

*

close(2); fchdir(2) (Linux 3.5 以 降 ); fstat(2) (Linux 3.6 以 降 )

*

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

*

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

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

*

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

*

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

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

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

O_SYNC フ ァ イ ル に 対 す る 書 き 込 み 操 作 は 、 同 期

I/O の フ ァ イ ル 完 全 性 完 了 の

要 件 に 基 づ い て 行 わ れ る (こ れ に 対 し O_DSYNC で は 同 期 I/O の デ ー タ 完 全 性 完 了 が 提 供 さ れ る )。

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

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

O_TMPFILE は 必 ず O_RDWRO_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 ... */

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) 呼 び 出 し 元 が 一 意 な 名 前 を 考 え る 必 要 が な い 、 と い う 特 長 を 持 つ 競 合 の な い 一 時 フ ァ イ ル の 作 成 。

* 最 初 は 見 え な い フ ァ イ ル を 作 成 し 、 そ れ か ら デ ー タ を 書 き 込 ん だ り 、 適 切 な フ ァ イ ル シ ス テ ム 属 性 を 持 つ よ う に 調 整 し た り

(chown(2), chmod(2), fsetxattr(2) な ど ) し た 後 、 準 備 が 全 て 整 っ た 状 態 で (上 述 の linkat(2) を 使 っ て ) フ ァ イ ル シ ス テ ム 内 に ア ト ミ ッ ク に リ ン ク を 行 う 。

O_TMPFILE は 、 裏 で 利 用 さ れ る フ ァ イ ル シ ス テ ム に よ る サ ポ ー ト が 必 要 で あ る 。 一 部 の Linux フ ァ イ ル シ ス テ ム だ け が こ の 機 能 を サ ポ ー ト し て い る 。 最 初 の 実 装 で は 、 ext2, ext3, ext4, UDF, Minix, shmem フ ァ イ ル シ ス テ ム が サ ポ ー ト し て い た 。 XFS で の サ ポ ー ト が Linux 3.15 で 追 加 さ れ た 。

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

creat()
creat
() は flagsO_CREAT|O_WRONLY|O_TRUNC を 指 定 し て open() を 行 う の と 等 価 で あ る 。

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

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

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

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

返 り 値

open(), openat(), creat() は 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 エ ラ ー が 発 生 し た 場 合 は −1 を 返 す (そ の 場 合 は errno が 適 切 に 設 定 さ れ る )。

エ ラ ー

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

EACCES フ ァ イ ル に 対 す る 要 求 さ れ た ア ク セ ス が 許 さ れ て い な い か 、

pathname

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

EDQUOT

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

EEXIST

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

EFAULT

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

EFBIG

EOVERFLOW 参 照 。

EINTR

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

EINVAL

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

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

EINVAL

flagsO_TMPFILE が 指 定 さ れ た が 、 O_WRONLYO_RDWR も 指 定 さ れ て い な か っ た 。

EISDIR

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

EISDIR

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

ELOOP

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

ELOOP

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

EMFILE

プ ロ セ ス が オ ー プ ン し て い る フ ァ イ ル 数 が す で に 最 大 数 に 達 し て い る (getrlimit(2) の RLIMIT_NOFILE の 説 明 を 参 照 )。

ENAMETOOLONG

pathname が 長 過 ぎ る 。

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

ENODEV

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

ENOENT

O_CREAT が 設 定 さ れ て お ら ず 、 か つ 指 定 さ れ た フ ァ イ ル が 存 在 し な い 。 ま た は 、 pathname の デ ィ レ ク ト リ 部 分 が 存 在 し な い か 壊 れ た (dangling) シ ン ボ リ ッ ク リ ン ク で あ る 。

ENOENT

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

ENOMEM

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

ENOSPC

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

ENOTDIR

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

ENXIO

O_NONBLOCK | O_WRONLY が 設 定 さ れ て お り 、 指 定 し た フ ァ イ ル が FIFO で そ の フ ァ イ ル を 読 み 込 み 用 で オ ー プ ン し て い る FIFO が 存 在 し な い 。 ま た は 、 フ ァ イ ル が デ バ イ ス ス ペ シ ャ ル フ ァ イ ル で 対 応 す る デ バ イ ス が 存 在 し な い 。

EOPNOTSUPP

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

EOVERFLOW

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

EPERM

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

EPERM

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

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

ETXTBSY

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

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. フ ラ グ 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 な ど の 機 能 検 査 マ ク ロ は ど の ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り 前 に 定 義 し な け れ ば な ら な い 。

注 意

Linux で は 、 O_NONBLOCK フ ラ グ は 、 open を 実 行 し た い が read ま た は write を 実 行 す る 意 図 は 必 ず し も な い こ と を 意 味 す る 。 こ れ は ioctl(2) の た め の フ ァ イ ル デ ィ ス ク リ プ タ ー を 取 得 す る た め に 、 デ バ イ ス を オ ー プ ン す る と き に よ く 用 い ら れ る 。

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

open() は ス ペ シ ャ ル フ ァ イ ル を オ ー プ ン す る こ と が で き る が 、 creat() で ス ペ シ ャ ル フ ァ イ ル を 作 成 で き な い 点 に 注 意 す る こ と 。 代 わ り に mknod(2) を 使 用 す る 。 フ ァ イ ル が 新 し く 作 成 さ れ る と 、 フ ァ イ ル の st_atime, st_ctime, st_mtime フ ィ ー ル ド (そ れ ぞ れ 最 終 ア ク セ ス 時 刻 、 最 終 状 態 変 更 時 刻 、 最 終 修 正 時 刻 で あ る 。 stat(2) 参 照 ) が 現 在 時 刻 に 設 定 さ れ る 。 さ ら に 親 デ ィ レ ク ト リ の st_ctimest_mtime も 現 在 時 刻 に 設 定 さ れ る 。 そ れ 以 外 の 場 合 で 、 O_TRUNC フ ラ グ で フ ァ イ ル が 修 正 さ れ た と き は 、 フ ァ イ ル の st_ctimest_mtime フ ィ ー ル ド が 現 在 時 刻 に 設 定 さ れ る 。 オ ー プ ン フ ァ イ ル 記 述 オ ー プ ン フ ァ イ ル 記 述 と い う 用 語 は POSIX で 使 用 さ れ て い る 用 語 で 、 オ ー プ ン さ れ て い る フ ァ イ ル の シ ス テ ム 共 通 の テ ー ブ ル の エ ン ト リ ー を 参 照 す る も の で あ る 。 別 の 文 脈 で は 、 こ の オ ブ ジ ェ ク ト は い ろ い ろ な 呼 び 方 が あ り 、 「 オ ー プ ン フ ァ イ ル オ ブ ジ ェ ク ト 」 、 「 フ ァ イ ル ハ ン ド ル 」 、 「 オ ー プ ン フ ァ イ ル テ ー ブ ル エ ン ト リ ー 」 、 カ ー ネ ル 開 発 者 の 用 語 で は struct file な ど と 呼 ば れ る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー が (dup(2) や 同 様 の シ ス テ ム コ ー ル を 使 っ て ) 複 製 さ れ る 際 に 、 複 製 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー は 元 の フ ァ イ ル デ ィ ス ク リ プ タ ー と 同 じ オ ー プ ン フ ァ イ ル 記 述 を 参 照 す る 。 結 果 と し て 2 つ の フ ァ イ ル デ ィ ス ク リ プ タ ー は フ ァ イ ル オ フ セ ッ ト と フ ァ イ ル 状 態 フ ラ グ を 共 有 す る 。 こ の よ う な 共 有 は プ ロ セ ス 間 で も 起 こ り 得 る 。 fork(2) で 作 成 さ れ た 子 プ ロ セ ス は 親 プ ロ セ ス の フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 を 継 承 し 、 こ れ ら の 複 製 は 同 じ オ ー プ ン フ ァ イ ル 記 述 を 参 照 す る 。

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

Linux は O_SYNCO_DSYNC を 実 装 し て い る が 、 O_RSYNC は 実 装 し て い な い (少 し 間 違 っ て い る の だ が 、 glibc で は O_RSYNCO_SYNC と 同 じ 値 で 定 義 さ れ て い る )。

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_SYNCO_DSYNC フ ラ グ の 値 を 含 む 新 し い (2 ビ ッ ト の ) フ ラ グ 値 と し て 定 義 さ れ て い る 。 こ れ に よ り 、 新 し い ヘ ッ ダ ー を 使 っ て コ ン パ イ ル さ れ た ア プ リ ケ ー シ ョ ン で 、 2.6.33 よ り 前 の カ ー ネ ル で 少 な く と も O_DSYNC の 動 作 は 同 じ に な る こ と が 保 証 さ れ る 。

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

UID マ ッ ピ ン グ を 使 用 し て い る NFS フ ァ イ ル シ ス テ ム で は 、 open() が フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 し た 場 合 で も read(2)EACCES で 拒 否 さ れ る 場 合 が あ る 。 こ れ は ク ラ イ ア ン ト が ア ク セ ス 許 可 の チ ェ ッ ク を 行 っ て open() を 実 行 す る が 、 読 み 込 み や 書 き 込 み の 際 に は サ ー バ ー で UID マ ッ ピ ン グ が 行 わ れ る た め で あ る 。 フ ァ イ ル ア ク セ ス モ ー ド 「 ア ク セ ス モ ー ド 」 の 値 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
() や デ ィ レ ク ト リ フ ァ イ ル デ ィ ス ク リ プ タ ー を 引 き 数 を 取 る 他 の シ ス テ ム コ ー ル や ラ イ ブ ラ リ 関 数 (execveat(2), faccessat(2), fanotify_mark(2), fchmodat(2), fchownat(2), fstatat(2), futimesat(2), linkat(2), mkdirat(2), mknodat(2), name_to_handle_at(2), readlinkat(2), renameat(2), symlinkat(2), unlinkat(2), utimensat(2) mkfifoat(3), scandirat(3)) は 二 つ の 理 由 か ら 用 意 さ れ て い る 。 こ こ で は 、 openat コ ー ル に 関 し て 説 明 す る が 、 こ の 基 本 原 理 は 他 の イ ン タ ー フ ェ ー ス で も 同 じ で あ る 。 最 初 の 理 由 と し て 、 openat() を 使 う と 、 ア プ リ ケ ー シ ョ ン は 、 カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ 以 外 の デ ィ レ ク ト リ で open() を 使 っ て フ ァ イ ル を オ ー プ ン す る 際 に 起 こ り 得 る 競 合 条 件 を 避 け る こ と が で き る 。 こ れ ら の 競 合 条 件 は 、 open() に 渡 さ れ た デ ィ レ ク ト リ プ レ フ ィ ッ ク ス の 構 成 要 素 が open() の 呼 び 出 し と 並 行 し て 変 化 す る 可 能 性 が あ る と い う 点 に 由 来 し て い る 。 例 え ば 、 フ ァ イ ル path/to/xxx が 存 在 す る 場 合 に フ ァ イ ル path/to/xxx.dep を 作 成 し た い と す る 。 問 題 は 、 存 在 確 認 と フ ァ イ ル 作 成 の 間 に 、 pathto (シ ン ボ リ ッ ク リ ン ク で も よ い ) が 別 の 場 所 を 指 す よ う に 変 更 さ れ る こ と が あ る と い う こ と だ 。 こ の よ う な 競 合 条 件 は 、 対 象 の デ ィ レ ク ト リ に 対 す る フ ァ イ ル デ ィ ス ク リ プ タ ー を オ ー プ ン し 、 そ れ か ら fstatat(2)openat() の dirfd 引 き 数 と し て そ の フ ァ イ ル デ ィ ス ク リ プ タ ー を 指 定 す る こ と で 、 避 け る こ と が で き る 。 二 つ 目 と し て 、 openat() を 使 う と 、 ア プ リ ケ ー シ ョ ン が 管 理 す る フ ァ イ ル デ ィ ス ク リ プ タ ー に よ り 、 ス レ ッ ド 単 位 の 「 カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ 」 を 実 装 す る こ と が で き る (こ の 機 能 は 、 /proc/self/fd/dirfd を 使 っ た 方 法 で も 実 現 す る こ と が で き る が 、 効 率 の 面 で 落 と る )。

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 が Linux で サ ポ ー ト さ れ た の は 、 カ ー ネ ル バ ー ジ ョ ン 2.4.10 で あ る 。 古 い Linux カ ー ネ ル は 、 こ の フ ラ グ を 単 に 無 視 す る 。 O_DIRECT フ ラ グ を サ ポ ー ト し て い な い フ ァ イ ル シ ス テ ム も あ り 、 そ の 場 合 は 、 O_DIRECT を 使 用 す る と open() は EINVAL で 失 敗 す る 。 ア プ リ ケ ー シ ョ ン は 、 同 じ フ ァ イ ル 、 特 に 同 じ フ ァ イ ル の 重 複 す る バ イ ト 領 域 に 対 し て 、 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 を デ フ ォ ル ト で は 無 効 に な っ て い る 性 能 向 上 の た め の オ プ シ ョ ン と 考 え て お く の が よ い で あ ろ う 。 「 O_DIRECT で い つ も 困 る の は 、 イ ン タ ー フ ェ ー ス 全 部 が 本 当 に お 馬 鹿 な 点 だ 。 た ぶ ん 危 な い マ イ ン ド コ ン ト ロ ー ル 剤 で 頭 が お か し く な っ た サ ル が 設 計 し た ん じ ゃ な い か な 」 — Linus

バ グ

現 在 の と こ ろ 、 open() の 呼 び 出 し 時 に O_ASYNC を 指 定 し て シ グ ナ ル 駆 動 I/O を 有 効 に す る こ と は で き な い 。 こ の フ ラ グ を 有 効 に す る に は fcntl(2) を 使 用 す る こ と 。 カ ー ネ ル が O_TMPFILE 機 能 を サ ポ ー ト し て い る か を 判 定 す る 際 に 、 EISDIRENOENT の 2 つ の エ ラ ー コ ー ド を チ ェ ッ ク し な け れ ば な ら な い 。

関 連 項 目

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), read(2), socket(2), stat(2), umask(2), unlink(2), write(2), fopen(3), fifo(7), path_resolution(7), symlink(7)

こ の 文 書 に つ い て

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