在Mac OS X上实现简单文件锁定失败:
import posixfile
f = posixfile.open('a', 'w')
f.lock('w')
运行时会导致以下异常:
IOError: [Errno 22] Invalid argument
我做错了,还是OS X真的不支持这个?如果它实际上不受支持,OS X会阻止它工作吗?
我知道我可以使用fcntl
,但posixfile
的语法看起来更清晰。
答案 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平台上也可能是错误的。)