Linux でのファイルロックの実装はいくつかある.
ここでは,
を紹介する.
ロック機構の指標
ファイルのロック機構を比較する上で, 指標になる項目は,
たとえば,
- 強制力: アドバイザリロック, 強制ロック
- 範囲: ファイル全体, バイト単位, など
- 種類: 排他, 共有
- 所有者: プロセスがロックを所有, ファイルディスクリプタ毎にロックを所有
- ファイルディスクリプタの複製時の振舞
このうち, 強制力については,
Linux でのデフォルトはアドバイザリロックで,
強制ロックに変更するにはマウントオプションに
mand
を追加しなければならない.
アドバイザリロックでは, ファイルが「ロック」されていても,
他のプロセスが読み書きなどのアクセスを行うことができる.
比較
機構 | 種類 | 範囲 | 所有者 |
fcntl | 排他, 共有 | バイト単位で範囲指定 | プロセス |
flock | 排他, 共有 | ファイル単位 | ファイルディスクリプタ |
lockf | 排他のみ | バイト単位で範囲指定 |
flock
では,
ファイルディスクリプタがロックを所有し,
複製 (
fork
,
dup
などで作成されるもの) は同じロックを参照する.
複製したファイルディスクリプタのうちいずれかに対して明示的にアンロック操作をした場合か,
ロックを参照する全てのファイルディスクリプタが閉じられたときにロックが開放される.
ひとつのプロセスが同じファイルに対する複数のファイルディスクリプタを取得した場合には,
それぞれに対して独立したロックが生成される.
Linux では,
lockf
は
fcntl
へのインターフェイスとして実装されている.
fcntl
では,
プロセスがロックを所有し,
fork
で作成された子プロセスには継承されないが,
execve
の前後ではロックが保存される.
ひとつのプロセスが同じファイルに対して複数のファイルディスクリプタを取得している場合には,
ロックは共通している.
ロックが適用されているファイルを参照しているファイルディスクリプタのいずれかが閉じられたとき,
ロックが開放される.
すなわち, 例えば
/etc/passwd
のロックを所有しているときに,
あるライブラリ関数がそのファイルを open, close すると,
そのファイルへのロックが開放される.
参考
0 件のコメント:
コメントを投稿