Является ли хорошей практикой использовать mkdir в качестве блокировки на основе файлов на Linux?

86
9

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


Итак, я использовал mkdir как атомную операцию, которая возвращает 1, если каталог не существует и 0, если это так. Я удаляю каталог сразу после критического раздела.


Теперь мне было указано, что это не хорошая практика вообще (независимо от языка). Я думаю, что все в порядке, но я хотел бы задать ваше мнение.


изменить:
чтобы показать пример, мой код выглядел примерно так:


while (!mkdir "lock_dir") {wait some time}
critical section
rmdir "lock_dir"

спросил(а) 2011-08-26T20:32:00+04:00 8 лет, 10 месяцев назад
1
Решение
95

ИМХО это очень плохая практика. Что, если perl script, который создал каталог блокировки, каким-то образом был убит во время критического раздела? Другой perl script, ожидающий удаления блокировки dir, будет ждать навсегда, потому что он не будет удален с помощью script, который изначально его создал.
Чтобы использовать безопасную блокировку, используйте файл flock() в файле блокировки (см. Perldoc-fl flock).

ответил(а) 2011-08-26T21:51:00+04:00 8 лет, 10 месяцев назад
66

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


После этого программа никогда не будет запущена, потому что блокировка заблокирована навсегда (при условии, что каталог находится в постоянной файловой системе).


Обычно я использовал бы flock с LOCK_EXCL.

Откройте файл для чтения + записи, создав его, если он не существует. Затем возьмите исключительную блокировку, если это не сработает (если вы используете LOCK_NB), то другой процесс заблокирован.


После того, как у вас есть блокировка, вам нужно оставить файл открытым.


Преимущество такого подхода заключается в том, что если процесс умирает неожиданно (например, сбой, уничтожается или машина терпит неудачу), блокировка автоматически освобождается.

ответил(а) 2011-08-26T23:27:00+04:00 8 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема