2014-01-14 4 views
5

Рассмотрите ситуацию, когда два процесса совершают параллельные попытки размещения исключительной блокировки для некоторого файла с использованием 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). Если нет, дайте мне знать.

+0

Если вы заявили об этом, это должно считаться ошибкой. Это похоже на 2 процесса, пытающихся получить мьютекс или семафор, и оба сбой, когда ничто в настоящее время не удерживает блокировку. – Duck

+0

Просто из любопытства: на какой файловой системе вы наблюдаете это? – alk

+0

@alk Я не наблюдаю этого. Я просто пытаюсь получить доступ к правильности предположения, что 'flock (fd, LOCK_EX | LOCK_NB)' никогда не терпит неудачу. Вы знаете, зависит ли реализация flock() от файловой системы? –

ответ

1

Чтение man flock(2):

EWOULDBLOCK Файл заблокирован и флаг LOCK_NB был выбран.

Таким образом, получение EWOULDBLOCK означает, что файл уже заблокирован. Если будет гарантировано, что ваши два процесса будут единственными, они никогда не получат EWOULDBLOCK в одном файле одновременно.

Обратите внимание, что потоки - это совсем другая история. Темы обычно делятся файловыми дескрипторами, поэтому несколько потоков в одном процессе могут вызвать flock() успешно в том же файле.

Смежные вопросы