Как работает этот пример канонического стада?
Когда нужно синхронизировать программы (сценарии оболочки) через файловую систему, я нашелflock
решение на основерекомендуемые (должно также работатьпо NFS). Канонический пример для использования изнутри скрипта (изhttp://linux.die.net/man/1/flock) является:
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
Я неЯ не понимаю, почему вся эта конструкция обеспечивает атомарность. В частности, мне интересно, в каком порядкеflock -s 200
а также200>/var/lock/mylockfile
выполняются, например, когдаbash
выполняет эти строки кода. Этот порядок гарантирован / детерминирован? Как я понимаю, этодолжен быть детерминированным, если эта идиома должна работать. Но поскольку в дочернем процессе создается дочерняя оболочка, я не понимаю, как эти два процесса синхронизируются друг с другом. Я вижу только состояние гонки между этими двумя командами.
Я был бы признателен, если бы кто-то мог заставить мою путаницу по поводу этого исчезнуть и объяснить, почему эта конструкция может использоваться для безопасной синхронизации процессов.
В то же время, если кто-то знает, меня интересует, насколько безопасно выбирать какой-то произвольный файловый дескриптор (например,200
в примере), особенно в контексте большой файловой системы NFS со многими клиентами.