python lockf: LOCK_EX 有效但 LOCK_SH 无效

python lockf: LOCK_EX works but LOCK_SH doesn't

我对 python fcntl 库中 lockf 函数的行为感到困惑:我无法获得共享锁,而独占锁有效:

In [1]: import fcntl                                                            

In [2]: f = open('file', 'w')                                                   

In [3]: fcntl.lockf(f, fcntl.LOCK_SH | fcntl.LOCK_NB)                           
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-3-5d23c6a5f968> in <module>
----> 1 fcntl.lockf(f, fcntl.LOCK_SH | fcntl.LOCK_NB)

OSError: [Errno 9] Bad file descriptor

In [4]: fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)                           

In [5]: 

错误代码对应于 http://man7.org/linux/man-pages/man3/lockf.3.html 中的 EBADF,这没有多大意义,因为 f 是一个可写的打开文件描述符。

有什么想法吗?

(Python 3.6.9,Ubuntu 18.04.4 LTS)

fcntl.lockf 确实看起来应该是 POSIX lockf 的包装,但事实并非如此。 POSIX lockf 甚至没有共享锁。

fcntl.lockf 是 POSIX fcntl 的包装。 LOCK_SH对应F_RDLCK,需要打开文件描述符读取.

当你阅读它时,你可能想阅读有关 the problems with file locking 的内容。