名 前
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_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’ に 対 す る フ ァ イ ル I/O ... */ snprintf(path,
PATH_MAX, "/proc/self/fd/%d", fd); O_TMPFILE と と も に O_EXCL を 指 定 す る と 、 一 時 フ ァ イ ル に 対 し て 上 記 の 方 法 で フ ァ イ ル シ ス テ ム へ の リ ン ク を 行 う こ と が で き な く な る (こ の 場 合 の O_EXCL の 意 味 は 他 の 場 合 の O_EXCL の 意 味 と は 異 な る 点 に 注 意 )。 O_TMPFILE に は 主 に 二 つ の 用 途 が あ る 。
れ る 、 (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() openat()
pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 こ の パ ス 名 は フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る (open() に 相 対 パ ス 名 を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。 pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 (open() と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。 pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。 返 り 値open(), openat(), creat() は 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 エ ラ ー が 発 生 し た 場 合 は −1 を 返 す (そ の 場 合 は errno が 適 切 に 設 定 さ れ る )。 エ ラ ーopen(), openat(), creat() は 以 下 の エ ラ ー で 失 敗 す る 。
の デ ィ レ ク ト リ 部 分 の 何 れ か の デ ィ レ ク ト リ に 検 索 許 可 が な か っ た 。 ま た は フ ァ イ ル が 存 在 せ ず 、 親 デ ィ レ ク ト リ へ の 書 き 込 み 許 可 が な か っ た 。 (path_resolution(7) も 参 照 す る こ と 。 )
|