Может ли Linux flock(fd, LOCK_EX|LOCK_NB) внезапно потерпеть неудачу?
Рассмотрим ситуацию, когда два процесса одновременно пытаются установить монопольную блокировку для некоторого файла, используя flock(fd, LOCK_EX|LOCK_NB)
,
Как указано, попытки не блокируют, поэтому один из двух процессов должен завершиться с ошибкой EWOULDBLOCK
,
Вот мой вопрос: (Linux) реализация flock()
гарантировать, что точно один из двух процессов будет успешным в каждом таком случае? Или, возможно, что оба в конечном итоге терпят неудачу с EWOULDBLOCK
даже когда никто не вмешивается?
Короче, может flock(fd, LOCK_EX|LOCK_NB)
когда-либо неудачно с EWOULDBLOCK
?
В основном меня интересует версия flock()
предлагается Linux, но информация о flock()
на других системах, таких как OS X, приветствуется.
Кроме того, я предполагаю, что ответ один и тот же, независимо от того, являются ли блокировки исключительными (LOCK_EX
) или поделился (LOCK_SH
). Если нет, дайте мне знать.
1 ответ
Чтение мужского стада (2):
EWOULDBLOCK Файл заблокирован, и был выбран флаг LOCK_NB.
Таким образом, получение EWOULDBLOCK означает, что файл уже заблокирован. Если гарантируется, что ваши два процесса являются единственными вовлеченными, они никогда не получат EWOULDBLOCK для одного и того же файла в одно и то же время.
Обратите внимание, что темы это другая история. Потоки обычно совместно используют файловые дескрипторы, поэтому несколько потоков в одном и том же процессе могут успешно вызывать flock() для одного и того же файла.