python lockf: LOCK_EX работает, но LOCK_ SH не работает - PullRequest
0 голосов
/ 27 марта 2020

Я озадачен поведением функции 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 является записываемым дескриптором открытого файла.

Есть идеи?

(Python 3.6 .9, Ubuntu 18.04.4 LTS)

1 Ответ

1 голос
/ 27 марта 2020

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

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

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

...