2

在 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看起来更干净。

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 平台列表中,因此它将落入“其他”平台。如果您查看 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 平台上也可能是错误的。)

于 2013-10-11T01:12:58.200 回答