python lockf: LOCK_EX работает, а LOCK_SH нет

Я озадачен поведением функции lockf из библиотеки python fcntl: я не могу получить разделяемую блокировку, в то время как эксклюзивная работает:

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]: ????

Код ошибки соответствует EBADF из http://man7.org/linux/man-pages/man3/lockf.3.html, что не имеет особого смысла, так как f — дескриптор открытого файла с возможностью записи.

Любые идеи?

(Питон 3.6.9, Ubuntu 18.04.4 LTS)


person psarka    schedule 27.03.2020    source источник


Ответы (1)


fcntl.lockf похоже, что это должна быть оболочка для POSIX lockf, но это не так. POSIX lockf даже не имеет общих блокировок.

fcntl.lockf — это оболочка для POSIX fcntl. LOCK_SH соответствует F_RDLCK, для которого требуется, чтобы дескриптор файла был открыт для чтения.

Пока вы этим занимаетесь, вы можете прочитать о проблемах с блокировкой файлов. .

person user2357112 supports Monica    schedule 27.03.2020
comment
Большое спасибо! Я прочитал этот пост, а также этот: gavv.github.io/articles/file- locks (упомянем его здесь, так как он очень информативен, хотя и не имеет отношения к тому, что Python сделал с lockf). - person psarka; 27.03.2020
comment
Еще один комментарий для людей из будущего: открытие с помощью a+ позволяет использовать оба типа блокировок для одного и того же файлового дескриптора. - person psarka; 27.03.2020