Открытие файла не является блокировкой, потому что, если каждый процесс должен сначала проверить, открыт ли файл, а не продолжить, если он есть, или создать или открыть его, если это не так, то два процесса вполне могут проверить одновременно, оба найдут что он не открыт, то создайте или откройте его.
Чтобы использовать файл в качестве блокировки, операция проверки и блокировки должна быть единственной непрерывной операцией. Вы можете добиться этого в файловой системе Unix, создав файл в режиме только для чтения и удалив его, чтобы разблокировать. Если файл существует (и доступен только для чтения), создание файла завершится неудачно, поэтому вы получаете проверку и блокировку в одной атомарной операции.
Если ваш процесс блокировки представляет собой сценарий оболочки, который будет работать как демон, вы можете получить этот эффект, используя параметр umask
для каждого процесса, который устанавливает разрешения для создания новых файлов:
oldumask = $ (Umask)
umask 222 # создавать файлы, которые не доступны для записи владельцу
if echo $$> / var / lock / foo
тогда
: блокировка прошла успешно
еще
: блокировка не удалась
фи
umask $ oldumask
Это также записывает PID собственного процесса в файл, что решает вашу другую проблему:
cat /var/lock/foo
Что касается конкретного вопроса «В каких процессах этот файл открыт?», Это может быть полезно, если вы хотите размонтировать файловую систему, но не можете, потому что у какого-то процесса есть открытый файл. Если у вас нет этих команд, вы можете задать их
/proc
как root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
или, как смертный пользователь:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'