pipe ("побитовое ИЛИ") в вызове fcntl.lockf () - PullRequest
0 голосов
/ 23 января 2019

Этот ответ содержит следующую строку:

fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)

Труба в Python "побитовое ИЛИ"

Я проверил документы Python для fcntl.lockf (fd, cmd, len = 0, start = 0, откуда = 0) и там написано, что cmd является одним из:

LOCK_UN - разблокировать

LOCK_SH - получить общую блокировку

LOCK_EX - приобрести эксклюзивный замок

Также читал об этих переменных здесь

Кто-нибудь понимает эту строку и что она делает, и если она будет работать только с одним аргументом и без символа канала?

LOCK_NB даже не упоминается в документации по Python ..

1 Ответ

0 голосов
/ 23 января 2019

Эти имена числовые константы , каждое в степени 2. Это означает, что они являются целыми числами с однобитным набором .

Вы можете объединить такие числа с |, чтобы получить целое число с множеством установленных битов, каждый бит представляет определенную опцию:

>>> import fcntl
>>> fcntl.LOCK_SH  # bit 1 set
1
>>> fcntl.LOCK_EX  # bit 2 set
2
>>> fcntl.LOCK_NB  # bit 3 set
4
>>> fcntl.LOCK_UN  # bit 4 set
8
>>> fcntl.LOCK_SH | fcntl.LOCK_UN  # combine bits 1 and 4
9
>>> format(fcntl.LOCK_SH | fcntl.LOCK_UN, '04b')
'1001'

Это очень распространенный способ передачи настроек конфигурации в системные вызовы. fctnl.lock() является одним из таких примеров, но есть много других, где применяется та же техника. os.open() call является другим примером, так же как и re флаги модуля .

Важно понимать, что это просто целые числа . Вместо установки флагов с помощью fcntl.LOCK_EX | fcntl.LOCK_NB (установка битов 2 и 3), вы можете просто передать 6:

fcntl.lockf(fp, 6)

и не будет никакой разницы, если говорить о функции lockf(). Смысл использования именованных констант заключается в том, что при использовании этих кодов самодокументируется код .

...