高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

OPS 09 - PBLockRangeを使用して任意のエリアをロックする

(14-May-96)

Q: PBLockRangeを使用して共有ファイルの小さなエリアをロックしているので、他からは書き込むことができないようになっています。他のマシンからロックされたエリアを読もうとすると(FSReadを使用)、エラー -45("ファイルがロックされている")が返されます。ロックされていないエリアを読もうとすると、問題なく動作します。

今まではPBLockRangeを使用したことはありませんでした。しかし、これに関するドキュメントでは(私が調べた範囲では、ということですが)、ロックは読み込みに対してではなく書き込みに対して適用されると書かれています。さらに、FSReadはエラー -45を返すとは書かれていません。

A: PBLockRangeはこの場合適切な動作をしており、また、そのようにいつでも動作するのです。そもそものアイデアというのは、あるファイルのセクションをロックすることによりそのセクションのすべてのアクセスをコントロールしたいということなのです。あるセクションをロックしてそこを変更している間は、他のユーザはそのファイルの変更が行われている部分を読むことができてはならないのです。その部分の情報がそのときに行われている変更に適切に同期していないために、古い情報を読み込んでしまう可能性があります。ファイル中のロックされている部分へのリードアクセスを拒否することにより、リードアクセスが行われる部分の完全性を保証することができるのです。

Inside Macintosh: Files2-50ページには、以下の記述があります。

「共有リード/ライト許可のモード(shared read/write permission)でオープンされたファイルの一部分をユーザが変更する必要が生じた場合、変更が行われている間その部分を他のユーザに使用不可能な状態にしておくことが、通常は望ましいといえます。変更が行われる前にバイトから構成されるレンジをロックするには PBLockRange 関数を、また、行われた変更がファイルに記録されたあとにロックを解除するには PBUnlockRange を使用します。」

「ファイル中のバイトから構成されるレンジをロックすることはその範囲に対して排他的リード/ライトアクセスを行うことであり、その他のユーザはアクセス不可になります。その他のユーザはロックが解除されるまでの間、そのレンジのいかなるバイトに対してもライトおよびリードを行うことはできません。ロックされている部分に対してデータのリードを行おうとすると、 fLckdErr エラーコードが返されます。
共有環境でファイルを使用する際の詳細な記述に関しては、Technical Note FL 37- "Want Permission to do What"をご覧ください。」


[ Technical Q&A's : Operating System Services : OS Utilities : OPS09 ]