名 前
memfd_create − 無 名 フ ァ イ ル (anonymous file) を 作 成 す る
書 式
#include <sys/memfd.h>
int memfd_create(const char *name, unsigned int flags);
説 明
memfd_create() は 、 無 名 フ ァ イ ル (anonymous file) を 作 成 し 、 そ の フ ァ イ ル を 参 照 す る フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 こ の フ ァ イ ル は 通 常 の フ ァ イ ル と 同 様 に 振 る 舞 い 、 変 更 、 切 り 詰 め (truncate)、 メ モ リ ー マ ッ プ な ど を 行 う こ と が で き る 。 し か し 、 通 常 の フ ァ イ ル と は 違 い 、 こ の フ ァ イ ル は RAM 上 に 置 か れ 、 格 納 さ れ る ス ト レ ー ジ は 揮 発 性 で あ る 。 こ の フ ァ イ ル へ の 参 照 が す べ て な く な る と 、 フ ァ イ ル は 自 動 的 に 解 放 さ れ る 。 こ の フ ァ イ ル が 置 か れ る ペ ー ジ に は 無 名 メ モ リ ー (anonymous memory) が 使 用 さ れ る 。 し た が っ て 、 memfd_create() で 作 成 さ れ た フ ィ ア ル は 、 他 の 無 名 メ モ リ ー の 割 り 当 て (MAP_ANONYMOUS フ ラ グ 付 き の mmap(2) を 使 っ て 割 り 当 て ら れ た 無 名 メ モ リ ー な ど ) と 同 じ 動 作 を す る 。 フ ァ イ ル の 初 期 サ イ ズ は 0 に 設 定 さ れ る 。 呼 び 出 し の 後 に 、 ftruncate(2) を 使 っ て フ ァ イ ル サ イ ズ を 設 定 す べ き で あ る (代 わ り に 、 write(2) や 同 様 の 関 数 を 呼 び 出 し て フ ァ イ ル に デ ー タ を 書 き 込 む こ と も で き る )。
name
に 指 定 さ れ た
名 前 は フ ァ イ
ル 名 と し て 使
用 さ れ 、 デ ィ
レ ク ト リ /proc/self/fd/
で 対 応 す る シ
ン ボ リ ッ ク リ
ン ク の リ ン ク
先 と し て 表 示
さ れ る 。 表 示
さ れ る 名 前 の
前 に は 常 に memfd:
が 付 き 、 こ の
名 前 は デ バ ッ
グ 用 途 と し て
の み 機 能 す る
。 名 前 は フ ァ
イ ル デ ィ ス ク
リ プ タ ー の 動
作 に は 影 響 せ
ず 、 複 数 の フ
ァ イ ル が 同 じ
名 前 を 持 っ て
も 副 作 用 は な
い 。 以 下 の 値
を ビ ッ ト 論 理
和 で flags に 指 定
し て 、 memfd_create() の
動 作 を 変 更 で
き る 。
MFD_CLOEXEC 新 し い フ ァ
イ ル デ ィ ス ク
リ プ タ ー に
close−on−exec (FD_CLOEXEC) フ
ラ グ を セ ッ ト
す る 。 こ れ が
有 用 な 理 由 に
つ い て は open(2) の
O_CLOEXEC フ ラ グ の
説 明 を 参 照 の
こ と 。
MFD_ALLOW_SEALING こ の フ ァ
イ ル に 対 し て
sealing 操 作 を 許 可
す る 。 fcntl(2) の
F_ADD_SEALS と F_GET_SEALS 操
作 の 議 論 を 参
照 。 下 記 の 「
注 意 」 も 参 照
。 初 期 の seal 集 合
は 空 と な る 。
こ の フ ラ グ を
指 定 し な か っ
た 場 合 、 初 期
の seal 集 合 は F_SEAL_SEAL
と な り 、 こ れ
は こ の フ ァ イ
ル に は 他 の seal を
セ ッ ト で き な
い こ と と い う
こ と で あ る 。
flags の 未 使 用 の ビ ッ ト は 0 で な け れ ば な ら な い 。 返 り 値 と し て memfd_create() は 、 作 成 し た フ ァ イ ル を 参 照 す る の に 使 用 で き る 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 こ の フ ァ イ ル デ ィ ス ク リ プ タ ー は 読 み 書 き 両 用 (O_RDWR) で オ ー プ ン さ れ 、 O_LARGEFILE が こ の フ ァ イ ル デ ィ ス ク リ プ タ ー に セ ッ ト さ れ る 。
fork(2) と execve(2) に 関 し て は 、 memfd_create() で 作 成 し た フ ァ イ ル デ ィ ス ク リ プ タ ー に つ い て も 通 常 の 動 作 が 適 用 さ れ る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー の コ ピ ー は fork(2) で 生 成 さ れ る 子 プ ロ セ ス に 継 承 さ れ 、 同 じ フ ァ イ ル を 参 照 す る 。 close−on−exec フ ラ グ が セ ッ ト さ れ て い な い 限 り 、 execve(2) の 前 後 で フ ァ イ ル デ ィ ス ク リ プ タ ー は 保 持 さ れ る 。
返 り 値
成 功 の 場 合 、 memfd_create() は 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。
エ ラ ー
EFAULT |
name の ア ド レ ス が 無 効 な メ モ リ ー を 指 し て い る 。
サ ポ ー
ト さ れ て い な
い 値 が い ず れ
か の 引 き 数 で
指 定 さ れ た 。
flags に 未 知 の ビ
ッ ト が 含 ま れ
て い た か 、 name
が 長 過 ぎ た 。
オ ー プ ン さ れ て い る フ ァ イ ル デ ィ ス ク リ プ タ ー の プ ロ セ ス 単 位 の 上 限 に 達 し た 。
バ ー ジ ョ ンmemfd_create() シ ス テ ム コ ー ル は Linux 3.17 で 初 め て 登 場 し た 。 GNU C ラ イ ブ ラ リ で の サ ポ ー ト は 検 討 中 で あ る 。 準 拠memfd_create() シ ス テ ム コ ー ル は Linux 固 有 で あ る 。 注 意memfd_create() シ ス テ ム コ ー ル は 、 手 動 で tmpfs フ ァ イ ル シ ス テ ム を マ ウ ン ト し て 、 そ の フ ァ イ ル シ ス テ ム に フ ァ イ ル を オ ー プ ン す る と い う 操 作 の 、 簡 単 な 代 替 手 段 を 提 供 し て い る 。 memfd_create() の 主 な 目 的 は 、 fcntl(2) が 提 供 す る file−sealing API で 使 用 で き る 、 フ ァ イ ル と そ れ に 関 連 付 け ら れ る フ ァ イ ル デ ィ ス ク リ プ タ ー を 作 成 す る こ と で あ る 。 memfd_create() シ ス テ ム コ ー ル は 、 file sealing な し で も 用 途 が あ る (こ れ が 明 示 的 に MFD_ALLOW_SEALING フ ラ グ が 要 求 さ れ な い 限 り 、 file−sealing が 無 効 に な る 理 由 で あ る )。 特 に 、 フ ァ イ ル シ ス テ ム に 実 際 に フ ァ イ ル を 残 す 意 図 が な い 場 合 、 tmp に フ ァ イ ル を 作 成 し た り open(2) O_TMPFILE を 使 っ た り す る 際 の 代 替 手 段 と し て 使 用 で き る 。 file
sealing sealing 機 構 の 使 い 方 の 例 は 以 下 の と お り で あ る 。
memfd_create() は こ れ 以 降 の ス テ ッ プ で 使 用 す る フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。
ル の サ イ ズ を 変 更 し 、 mmap(2) を 使 っ て そ の フ ァ イ ル を マ ッ ピ ン グ し 、 共 有 メ モ リ ー に 所 望 の デ ー タ を 配 置 す る 。
fcntl(2) の F_ADD_SEALS 操 作 を 使 っ て 、 そ の フ ァ イ ル に seal を い く つ か 設 定 す る 。 (seal F_SEAL_WRITE を 設 定 す る 場 合 、 直 前 の ス テ ッ プ で 作 成 し た 書 き 込 み 可 能 な 共 有 マ ッ ピ ン グ を ま ず ア ン マ ッ プ す る 必 要 が 出 て く る 。 )
し 、 そ の フ ァ イ ル を マ ッ プ す る 。 以 下 に 示 す 方 法 を 使 用 す る こ と が で き る 。
|