2

Mac OS X で単純なファイル ロックを実装すると失敗します。

import posixfile

f = posixfile.open('a', 'w')
f.lock('w')

これを実行すると、次の例外が発生します。

IOError: [Errno 22] Invalid argument

私のやり方が間違っているのでしょうか、それとも OS X は本当にこれをサポートしていないのでしょうか? 実際にサポートされていない場合、OS X の何が動作を妨げているのでしょうか?

fcntl代わりに使用できることはわかっていますが、構文posixfileは非常にきれいに見えます。

4

1 に答える 1

2

モジュールのドキュメントの最上部近くにある大きなピンク色のボックスからわかるように:

バージョン 1.5 で非推奨: このモジュールが提供するロック操作は、fcntl.lockf() 呼び出しによってより適切に実行され、より移植性が高くなります。

つまり、1997 年に廃止されたということです。その時点では、Mac OS X はアイデアとして存在すらしておらず、最初のバージョンは 2001 年にリリースされました。

したがって、誰もこのモジュールの OS X 固有の実装を作成したことがないことは驚くべきことではありません。驚くべきことは、3.0 まで完全に削除されなかったことです。


うまくいかない理由を正確に知りたい場合は、ソースを参照してください。詳細を調べなくても、*BSD、AIX、およびその他の特定されていないもの (AT&T SysV および 100% 互換性?) のコードがあることがすぐにわかります。「darwin」は *BSD プラットフォームのリストにないため、「something else」に分類されることに注意してください。の OS X マンページを見ると、ご想像のとおりfcntlstruct flock「何か別の」レイアウトではなく、明らかに BSD レイアウトです。

したがって、type(h)-whence(h)-start(l)-len(l)-sysid(h)-pid(h) の構造体を、start(q)-len( を期待する API に渡しています。 q)-pid(l)-type(h)-whence(h)。segfault の代わりに I/O エラーが発生したのは幸運です。

実際、BSD 名のリストに「darwin」を追加したとしても、start と len の上位 32 ビットを破棄し、パッド ゼロで置き換えるため、そのコードは正しくありません。(これは、最近の FreeBSD やその他の *BSD プラットフォームでもおそらく間違っています。)

于 2013-10-11T01:12:58.200 に答える