【问题标题】:python lockf: LOCK_EX works but LOCK_SH doesn'tpython lockf:LOCK_EX 有效,但 LOCK_SH 无效
【发布时间】:2020-03-27 09:23:47
【问题描述】:

我对 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)

【问题讨论】:

    标签: python fcntl


    【解决方案1】:

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

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

    在阅读过程中,您可能想了解一下the problems with file locking

    【讨论】:

    • 非常感谢!我读了那篇文章,还有这篇文章:gavv.github.io/articles/file-locks(在这里提到它,因为它提供了超级丰富的信息,尽管它没有处理 Python 对 lockf 所做的事情)。
    • 对未来人们的另一条评论:使用a+ 打开允许在同一个文件描述符上使用两种类型的锁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2012-06-14
    • 2018-11-01
    相关资源
    最近更新 更多