2011-01-05

Linux におけるファイルの排他制御

Linux でのファイルロックの実装はいくつかある. ここでは,
  • flock
  • lockf
  • fcntl
を紹介する.

ロック機構の指標

ファイルのロック機構を比較する上で, 指標になる項目は, たとえば,
  • 強制力: アドバイザリロック, 強制ロック
  • 範囲: ファイル全体, バイト単位, など
  • 種類: 排他, 共有
  • 所有者: プロセスがロックを所有, ファイルディスクリプタ毎にロックを所有
  • ファイルディスクリプタの複製時の振舞
このうち, 強制力については, Linux でのデフォルトはアドバイザリロックで, 強制ロックに変更するにはマウントオプションに mandを追加しなければならない. アドバイザリロックでは, ファイルが「ロック」されていても, 他のプロセスが読み書きなどのアクセスを行うことができる.

比較

機構種類範囲所有者
fcntl排他, 共有バイト単位で範囲指定プロセス
flock排他, 共有ファイル単位ファイルディスクリプタ
lockf排他のみバイト単位で範囲指定

flock では, ファイルディスクリプタがロックを所有し, 複製 (fork, dup などで作成されるもの) は同じロックを参照する. 複製したファイルディスクリプタのうちいずれかに対して明示的にアンロック操作をした場合か, ロックを参照する全てのファイルディスクリプタが閉じられたときにロックが開放される. ひとつのプロセスが同じファイルに対する複数のファイルディスクリプタを取得した場合には, それぞれに対して独立したロックが生成される.

Linux では, lockffcntl へのインターフェイスとして実装されている.

fcntl では, プロセスがロックを所有し, fork で作成された子プロセスには継承されないが, execve の前後ではロックが保存される. ひとつのプロセスが同じファイルに対して複数のファイルディスクリプタを取得している場合には, ロックは共通している. ロックが適用されているファイルを参照しているファイルディスクリプタのいずれかが閉じられたとき, ロックが開放される. すなわち, 例えば /etc/passwd のロックを所有しているときに, あるライブラリ関数がそのファイルを open, close すると, そのファイルへのロックが開放される.

参考

0 件のコメント:

コメントを投稿