Как решить, что консультативные блокировки файла POSIX работают в simfs в VM, который я использую?

К сожалению, такая вещь действительно не существует. Используя Марионетку отчасти похож на веб-приложения разработки, прежде чем были платформы. Вы напишете много кода лесов.. хорошо по крайней мере это было моим опытом до сих пор. Марионеточный Штамповочный пресс Модуля очень случаен, и я был справедливо не впечатлен большинством модулей там.

Я рекомендовал бы смотреть на попытки Example42 создать последовательную систему. Я использовал много его модулей для начальной загрузки моей последней Марионеточной установки, в которой Вы испытываете необходимость для изменения довольно мало его кода, потому что это основано на RHEL/CentOS однако, он использует класс параметрических усилителей, который делает поддержку других дистрибутивов довольно простой.

2
задан 12 February 2015 в 08:13
2 ответа

Во-первых: блокировки файлов и мьютексы pthread совершенно разные звери. Блокировки файлов используются, чтобы сообщить текущим или другим процессам, что файл в настоящее время не используется. Мьютексы Pthread используются для координации критических секций между потоками в только текущем процессе .

Блокировка файлов выполняется flock (2) и другие, и для удобства есть оболочка сценария оболочки для этого. Чтобы проверить, работает ли блокировка файлов, вы открываете два терминала и запускаете следующее:

В первом терминале:

flock /path/to/lockfile sleep 120

И в другом терминале, когда первый удерживает блокировку:

if ! flock -n /tmp/foo.lock true ; then echo "flock works"; else echo "flock fails"; fi

Это должно сказать вам, работают ли блокировки файлов.

И если вам нужно запустить его в одном скрипте, попробуйте следующее:

flock /path/to/lockfile sleep 120 &
if ! flock -n /tmp/foo.lock true ; then echo "flock works"; else echo "flock fails"; fi
kill $!

Другой Способ блокировки файлов - системный вызов fcntl . Тестировать с помощью ruby ​​довольно утомительно, но этот код Python должен помочь:

import fcntl, os, time

fd = open('/tmp/test.lock', 'w')
if os.fork():
    fcntl.lockf(fd, fcntl.LOCK_EX)
    os.wait()
else:
    time.sleep(0.1)
    fcntl.lockf(fd, fcntl.LOCK_EX|fcntl.LOCK_NB)

Он пытается заблокировать один и тот же файл в двух разных процессах. Вторая блокировка неблокирующая, поэтому должна немедленно вызвать ошибку. Ожидаемый результат, если блокировки fcntl работают правильно, будет:

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    fcntl.lockf(fd, fcntl.LOCK_EX|fcntl.LOCK_NB)
IOError: [Errno 11] Resource temporarily unavailable
3
ответ дан 3 December 2019 в 10:49

У меня нет openvz vm для тестирования, но я думаю, вам нужно прочитать это примечание о рекомендательной блокировке. Консультативная блокировка требует сотрудничества со стороны участвующих процессов. Предположим, что процесс «A» получил блокировку WRITE и начал запись в файл, а процесс «B», не пытаясь получить блокировку, может открыть файл и записать в него. Здесь процесс «B» - это не сотрудничающий процесс. Если процесс «B» пытается получить блокировку, это означает, что этот процесс взаимодействует для обеспечения «сериализации».

Консультативная блокировка будет работать, только если участвующий процесс взаимодействует. Консультативная блокировка иногда также называется «принудительной блокировкой».

0
ответ дан 3 December 2019 в 10:49

Теги

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