Получите эксклюзивное чтение-запись, соединяют файл для атомарных обновлений

Это - сложная вещь, принимая во внимание временной интервал, бесконечные возможности для ускорения (или скорость) кривая, framerate-или независимое от задержки поведение, и т.д.

Поведение при сравнении с OS'es с закрытым исходным кодом или драйверами почти невозможно, но X.org предоставляет Вам вполне достаточный выбор для Вашего вкуса, если Вы не торопитесь для чтения документации или источника.

Неускоренное поведение (плоская ускоряющая кривая, линейная скоростная кривая, линейный ответ мыши или пиксели N на 1 мм перемещения) является единственным действительно универсальным, легко адаптируемым и легко принимаемым поведением. Как ни странно, это также, в чем большинство систем испытывает недостаток или делает очень трудно для получения. (См. этот нерешенный вопрос, например.)

Принятие Вас хочет линейный ответ, я направлю Вас назад на вопрос, который Вы связали.

10
29.12.2013, 22:11
3 ответа

Обработка Bash команды ниже может быть удивительной:

flock -x -w 5 /dev/shm/counter.txt echo "4" >  /dev/shm/counter.txt && sleep 5

Bash сначала работает flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt и, если это завершается успешно (выпускающий блокировку), то она работает sleep 5. Таким образом блокировка не сохранена в течение 5 секунд, которые можно ожидать.

11
27.01.2020, 19:59
  • 1
    это удивило бы меня если в A && B, A ожидал бы B закончиться. –  Andras Gyomrey 17.10.2016, 16:39

Блокировки файла не являются mandatory1 - т.е. Вы не можете заблокировать файл так, чтобы другой процесс не мог получить доступ к нему. Блокировка файла означает, что, если (nother) обрабатывают проверки, чтобы видеть, было ли это заблокировано, она будет знать.

Цель flock должен сделать материал как то, что Вы хотите, но необходимо затем использовать flock для каждого предпринятого доступа. Следует иметь в виду, что они блокируют вызовы; от man flock:

если блокировка не может быть сразу получена, скопление ожидает, пока блокировка не доступна


1. Который заставляет функцию казаться бесполезной, если Вы используете ее для, например, безопасность, но это не цель блокировок файла - они для синхронизации, которая является тем, что Вы делаете. Пользователь Leo указал, что может быть не стандартизированная реализация обязательного захвата файла в ядре Linux (см. это обсуждение), на основе исторических параллелей от другого *отклоняют операционные системы. Однако это надеется быть интерфейсом уровня C только.

15
27.01.2020, 19:59
  • 1
    Спасибо!, Это помогает понять 'консультативный' аспект и как я должен использовать flock каждый раз. очень полезный! –  d-_-b 29.12.2013, 22:08

Вы можете использовать «sh -c command ...» для запуска всей команды оболочки, включая перенаправление файлов, с удерживаемой блокировкой. Кроме того, поскольку вы используете файл в качестве счетчика, вам необходимо постоянно удерживать блокировку, пока вы выполняете чтение и обратную запись. Таким образом, вы можете сделать что-то вроде этого, чтобы увеличить счетчик и вернуть его новое значение:

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'read count < /dev/shm/counter.txt ; echo $((count + 1)) > /dev/shm/counter.txt ; echo $((count + 1))'

Замена знаков плюс на знаки минус должна уменьшить счетчик:

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'read count < /dev/shm/counter.txt ; echo $((count - 1)) > /dev/shm/counter.txt ; echo $((count - 1))'

Я ожидаю, что вы инициализируете счетчик до того, как возникнет какая-либо конкуренция, так что не стоит беспокоиться о блокировке так рано:

echo 0 > /dev/shm/counter.txt

Я не думаю, что вам когда-нибудь понадобится стирать значение счетчика, пока может возникнуть конфликт, но, если вы когда-либо это сделали, вы должны сделать это следующим образом:

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'echo 0 > /dev/shm/counter.txt'

Думаю, вы понимаете, как выполнять чтение, но я включаю его для полноты:

flock --shared /dev/shm/counter.txt cat /dev/shm/counter.txt
1
27.01.2020, 19:59

Теги

Похожие вопросы