Я нашел шаблонный flock(1)
код, который выглядит многообещающим. Теперь я хочу разобраться в компонентах, прежде чем слепо использовать его.
Похоже, что эти функции используют третью форму flock
flock [-sxun] [-w тайм-аут] fd
Третья форма удобна внутри сценариев оболочки и обычно используется следующим образом:
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
Часть, в которой я потерялся (из примеров функций оболочки), - это обозначение
eval "exec $LOCKFD>\"$LOCKFILE\""
или сокращенно из flock
man-страницы
200>/var/lock/mylockfile
Что это дает?
Я замечаю, что последующие команды flock
передали значение, отличное от значения в исходном перенаправлении, вызывают flock
жалобу
flock: 50: Bad file descriptor
Кажется, что flock
использует файловые дескрипторы как карту, чтобы знать, с каким файлом работать. Однако для того, чтобы это работало, эти дескрипторы должны все еще присутствовать и быть связаны с файлом, верно?
После завершения перенаправления и создания файла блокировки не закрывается ли файл и не испаряются ли файловые дескрипторы, связанные с открытым файлом? Я думал, что файловые дескрипторы связаны только с открытыми файлами.
Что тут происходит?