pipe ("побитовое ИЛИ") в вызове fcntl.lockf()

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

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 ответ

Решение

Эти имена являются числовыми константами, каждая из которых имеет степень 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() вызов является еще одним примером, как и re Флаги модуля.

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

fcntl.lockf(fp, 6)

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

Другие вопросы по тегам