Почему fcntl start=0, len=0, откуда=2 работает?

Согласно руководству fcntl, блокировка fcntl с start=0, len=0, откуда=2 должна блокировать диапазон байтов, начиная с конца файла (whence=2), со смещением 0 (start=0) до конца файла. (len=0), что, на мой взгляд, означает блокировку всего 0 байтов от EOF до EOF.

В этом случае я ожидаю, что блокировка с этими аргументами ничего не заблокирует. Однако, если я попытаюсь (используя оболочку python fcntl), следующий код что-то блокирует, и вторая копия ожидает завершения первой:

f = open('some_file', 'a+')
fcntl.lockf(f, fcntl.LOCK_EX, 0, 0, 2)
print('got the lock')
time.sleep(100)

Точно так же работает и код с параметрами where=2, offset=100, len=0, даже те, в этом случае диапазон байтов задом наперед [EOF + 100, EOF].

Что я закрываю?


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


Ответы (1)


Я провел несколько тестов, и ответ выглядит следующим образом: wherece=2 блокируется не до EOF, а до бесконечности, что не так, как я бы прочитал описание на странице руководства:

Указание 0 для l_len имеет особое значение: заблокировать все байты, начиная с местоположения, указанного l_whence и l_start, до конца файла, независимо от того, насколько велик будет размер файла.

????

person psarka    schedule 09.01.2021