Рассмотрите ситуацию, когда два процесса совершают параллельные попытки размещения исключительной блокировки для некоторого файла с использованием flock(fd, LOCK_EX|LOCK_NB)
.Может ли Linux 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
). Если нет, дайте мне знать.
Если вы заявили об этом, это должно считаться ошибкой. Это похоже на 2 процесса, пытающихся получить мьютекс или семафор, и оба сбой, когда ничто в настоящее время не удерживает блокировку. – Duck
Просто из любопытства: на какой файловой системе вы наблюдаете это? – alk
@alk Я не наблюдаю этого. Я просто пытаюсь получить доступ к правильности предположения, что 'flock (fd, LOCK_EX | LOCK_NB)' никогда не терпит неудачу. Вы знаете, зависит ли реализация flock() от файловой системы? –