Открытие файла не является блокировкой, потому что, если каждый процесс должен сначала проверить, открыт ли файл, а не продолжить, если он есть, или создать или открыть его, если это не так, то два процесса вполне могут проверить одновременно, оба найдут что он не открыт, то создайте или откройте его.
Чтобы использовать файл в качестве блокировки, операция проверки и блокировки должна быть единственной непрерывной операцией. Вы можете добиться этого в файловой системе Unix, создав файл в режиме только для чтения и удалив его, чтобы разблокировать. Если файл существует (и доступен только для чтения), создание файла завершится неудачно, поэтому вы получаете проверку и блокировку в одной атомарной операции.
Если ваш процесс блокировки представляет собой сценарий оболочки, который будет работать как демон, вы можете получить этот эффект, используя umask
, параметр для каждого процесса, который устанавливает разрешения, с которыми создаются новые файлы:
oldumask=$(umask)
umask 222 # create files unwritable to owner too
if echo $$ > /var/lock/foo
then
: locking succeeded
else
: locking failed
fi
umask $oldumask
Это также записывает PID процесса-владельца в файл, который решает вашу другую проблему:
cat /var/lock/foo
Что касается конкретного вопроса "Какие процессы открыли этот файл?msgstr ", это может быть полезно, когда вы хотите размонтировать файловую систему, но не можете, потому что в каком-то процессе открыт файл. Если у вас нет этих команд, вы можете задать
/proc
как root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
или, как смертный пользователь:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'