Linux雑多メモ(2017/02/17)

● O_TMPFILE と renameat2
open(2)に使えるO_TMPFILEがLinux-3.11より追加されている。(60545d0d46 あたり)。O_TMPFILEはマニュアルに書いてあるとおり一時ファイルを作れる。anonymouseとは違って、inodeの実態はあるんだけど参照ができない(lookupできない(pathで辿れない))ようなファイルを作れる。それだけだとあまり意味がない(スワップできるメモリが欲しいだけならtmpfsのほうが遥かによい)、O_TMPFILEはlinkat(2)を使ってあとからpathを作れる。これによって、作成途中を見せずにファイルを作れる。ただrename系と違って、既存のファイルを上書きすることは(現時点では)できない。

一方、renameat2(2)というシステムコールがLinux-3.15より追加されている。通常のrenameと比べて引数flagが増えていて、下記が使えるようになっている。
・ RENAME_NOREPLACE, 上書きする場合はエラーになる
・ RENAME_EXCHANGE, oldをnewに上書きするのではなく、oldとnewを入れ替える
・ RENAME_WHITEOUT(Linux-3.18から), whiteoutなinodeにする、OverlayFSなどで下位のFilesystemに存在する名前を上からカバーして「見えない状態」にしてファイルがないことにしてしまう仕組み。

で、O_TMPFILEとrenameat2を使えば「途中状態を見せずにアトミックにファイルを上書き」できるような気がしつつ現時点ではできない。議論はあるみたいなので、そのうち拡張されてできるようになるのかもしれない。

● sync系システムコール
sync, fsync, fdatasync, syncfs, sync_file_range, sync_file_range2がある。msyncは名前が似てるけどちょっと役割が違う、とはいえ結局kernel内部ではvfs_fsync_range()を呼んんでいるので似たようなことをするということでよいようだ。

このブログ記事について

このページは、らるるが2017年2月17日 21:25に書いたブログ記事です。

ひとつ前のブログ記事は「pthread_cond_timedwait()の引数の時刻」です。

次のブログ記事は「「Androidを支える技術<I>」読んだ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0