Python posxifile.lock()Mac OS X上的IOError

时间:2013-10-11 00:44:19

标签: python macos locking

在Mac OS X上实现简单文件锁定失败:

import posixfile

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

运行时会导致以下异常:

IOError: [Errno 22] Invalid argument

我做错了,还是OS X真的不支持这个?如果它实际上不受支持,OS X会阻止它工作吗?

我知道我可以使用fcntl,但posixfile的语法看起来更清晰。

1 个答案:

答案 0 :(得分:2)

正如您可以从the module's docs顶部附近的大粉红色框中看到的那样:

  

从版本1.5开始不推荐使用:fcntl.lockf()调用可以更好,更便携地执行此模块提供的锁定操作。

这意味着它在1997年被弃用。那时Mac OS X甚至不存在,第一个版本于2001年发布。

因此,没有人编写过该模块的OS X特定实现并不奇怪。令人惊讶的是,它直到3.0才被完全删除。


如果您想确切知道它无效的原因,请查看the source。在不深入细节的情况下,您可以立即看到* BSD,AIX和其他未指定的代码(AT& T SysV和100%兼容?)的代码。请注意,“darwin”不在* BSD平台的列表中,因此它将落入“其他东西”。如果您查看fcntl的OS X联机帮助页,其struct flock显然是BSD布局,正如您所期望的那样,而不是“其他”布局。

所以,你将类型为(h)-wence(h)-start(l)-len(l)-sysid(h)-pid(h)的结构传递给期望start(q)的API -len(q)-pid(升)型(H)-whence(H)。你很幸运得到I / O错误而不是段错误。

实际上,即使你将“darwin”添加到BSD名称列表中,该代码仍然不正确,因为它抛弃了start和len的前32位并用pad零替换它们。 (这在现代FreeBSD和其他* BSD平台上也可能是错误的。)