名 前
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) で
説 明 さ れ て い
る マ ウ ン ト オ
プ シ ョ ン bsdgroups
と sysvgroups を 参 照
)。
mode は 新 し い フ ァ イ ル を 作 成 す る 場 合 に 使 用 す る ア ク セ ス 許 可 (permission) を 指 定 す る 。 flags に O_CREAT か O_TMPFILE が 指 定 さ れ て い る 場 合 、 mode を 指 定 し な け れ ば な ら な い 。 O_CREAT も O_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_GETFD と
F_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 を 参 照 )
flags に O_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_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 ... */
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() は flags に
O_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_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 も 指 定 さ れ て い な か っ た 。
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
プ ロ セ ス が オ ー プ ン し て い る フ ァ イ ル 数 が す で に 最 大 数 に 達 し て い る (getrlimit(2) の RLIMIT_NOFILE の 説 明 を 参 照 )。
ENAMETOOLONG
pathname が 長 過 ぎ る 。
ENFILE オ ー プ ン さ れ て い る フ ァ イ ル の 総 数 が シ ス テ ム の 制 限 に 達 し て い る 。
ENODEV
pathname が デ バ イ ス ス ペ シ ャ ル フ ァ イ ル を 参 照 し て お り 、 対 応 す る デ バ イ ス が 存 在 し な い 。 (こ れ は Linux カ ー ネ ル の バ グ で あ り 、 こ の 場 合 に は ENXIO が 返 さ れ る べ き で あ る )
ENOENT
O_CREAT が 設 定 さ れ て お ら ず 、 か つ 指 定 さ れ た フ ァ イ ル が 存 在 し な い 。 ま た は 、 pathname の デ ィ レ ク ト リ 部 分 が 存 在 し な い か 壊 れ た (dangling) シ ン ボ リ ッ ク リ ン ク で あ る 。
ENOENT
pathname が 存 在 し な い デ ィ レ ク ト リ を 参 照 し て い て 、 O_TMPFILE お よ び O_WRONLY と O_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_ctime と st_mtime も 現 在 時 刻 に 設 定 さ れ る 。 そ れ 以 外 の 場 合 で 、 O_TRUNC フ ラ グ で フ ァ イ ル が 修 正 さ れ た と き は 、 フ ァ イ ル の st_ctime と st_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_SYNC と O_DSYNC を 実 装 し て い る が 、 O_RSYNC は 実 装 し て い な い (少 し 間 違 っ て い る の だ が 、 glibc で は O_RSYNC が O_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_SYNC は O_DSYNC フ ラ グ の 値 を 含 む 新 し い (2 ビ ッ ト の ) フ ラ グ 値 と し て 定 義 さ れ て い る 。 こ れ に よ り 、 新 し い ヘ ッ ダ ー を 使 っ て コ ン パ イ ル さ れ た ア プ リ ケ ー シ ョ ン で 、 2.6.33 よ り 前 の カ ー ネ ル で 少 な く と も O_DSYNC の 動 作 は 同 じ に な る こ と が 保 証 さ れ る 。
NFS
NFS を 実 現 し て い
る プ ロ ト コ ル
に は 多 く の 不
備 が あ り 、 特
に O_SYNC と O_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
を 作 成 し た い
と す る 。 問 題
は 、 存 在 確 認
と フ ァ イ ル 作
成 の 間 に 、 path
や to (シ ン ボ リ
ッ ク リ ン ク で
も よ い ) が 別 の
場 所 を 指 す よ
う に 変 更 さ れ
る こ と が あ る
と い う こ と だ
。 こ の よ う な
競 合 条 件 は 、
対 象 の デ ィ レ
ク ト リ に 対 す
る フ ァ イ ル デ
ィ ス ク リ プ タ
ー を オ ー プ ン
し 、 そ れ か ら
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 機 能 を サ ポ ー ト し て い る か を 判 定 す る 際 に 、 EISDIR と ENOENT の 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/ に 書 か れ て い る 。