在 Mac OS X 上实现简单文件锁定失败:
import posixfile
f = posixfile.open('a', 'w')
f.lock('w')
运行时会导致以下异常:
IOError: [Errno 22] Invalid argument
我做错了吗,还是 OS X 真的不支持这个?如果它实际上不受支持,那么阻止它工作的 OS X 是什么?
我知道我可以fcntl
改用,但 for 的语法posixfile
看起来更干净。
从模块文档顶部附近的粉红色大框可以看出:
1.5 版后已弃用:此模块提供的锁定操作通过 fcntl.lockf() 调用完成得更好,更便携。
这意味着它在 1997 年就被弃用了。Mac OS X 在那个时候甚至还没有作为一个想法存在,第一个版本是在 2001 年发布的。
因此,没有人为此模块编写特定于 OS X 的实现也就不足为奇了。令人惊讶的是,它直到 3.0 才被完全删除。
如果您想确切地知道它为什么不起作用,请查看源代码。无需深入了解细节,您就可以立即看到 *BSD、AIX 和其他未指定的代码(AT&T SysV 和 100% 兼容?)。请注意,“darwin”不在 *BSD 平台列表中,因此它将落入“其他”平台。如果您查看 OS X 手册页fcntl
,它struct flock
显然是 BSD 布局,如您所料,而不是“其他”布局。
因此,您将 type(h)-whence(h)-start(l)-len(l)-sysid(h)-pid(h) 的结构传递给需要 start(q)-len( q)-pid(l)-type(h)-whence(h)。你很幸运,你得到的是 I/O 错误而不是段错误。
事实上,即使您在 BSD 名称列表中添加了“darwin”,该代码仍然不正确,因为它会丢弃 start 和 len 的前 32 位并用填充零替换它们。(这在现代 FreeBSD 和其他 *BSD 平台上也可能是错误的。)