Что дает 200 ›$ somefile?

Я нашел шаблонный 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 использует файловые дескрипторы как карту, чтобы знать, с каким файлом работать. Однако для того, чтобы это работало, эти дескрипторы должны все еще присутствовать и быть связаны с файлом, верно?

После завершения перенаправления и создания файла блокировки не закрывается ли файл и не испаряются ли файловые дескрипторы, связанные с открытым файлом? Я думал, что файловые дескрипторы связаны только с открытыми файлами.

Что тут происходит?


person quickshiftin    schedule 10.02.2014    source источник
comment
Прошло как минимум 10 лет с тех пор, как я изучал программирование под Unix и Linux в колледже, поэтому файловые дескрипторы сейчас для меня немного расплывчаты. Пожалуйста, потерпите меня!   -  person quickshiftin    schedule 11.02.2014
comment
Он перенаправляет файловый дескриптор # 200 на этот путь.   -  person bmargulies    schedule 11.02.2014


Ответы (1)


200>/var/lock/mylockfile

Это создает файл /var/lock/mylockfile, который может быть записан через файловый дескриптор 200 внутри суб-оболочки. Число 200 - произвольное. Выбор большого числа снижает вероятность того, что какая-либо из команд внутри суб-оболочки «заметит» дополнительный дескриптор файла.

(Как правило, дескрипторы файлов 0, 1 и 2 используются стандартным вводом, выводом и обработкой данных соответственно. Это число могло быть всего лишь 3.)

flock -s 200

Затем flock используется для блокировки файла с помощью ранее созданного файлового дескриптора. Ему нужен доступ на запись к файлу, который предоставлен > в 200>. Обратите внимание, что это происходит после перенаправления, указанного выше.

person John Kugelman    schedule 10.02.2014
comment
Так что нет никакого вреда в вызове 200>/var/lock/mylockfile из другого процесса, поскольку вызов flock -xn 200 все равно будет бомбить, если этот процесс не был тем, который изначально получил блокировку? - person quickshiftin; 11.02.2014
comment
Если вы помните, что у каждого процесса есть свои файловые дескрипторы. Дочерние процессы наследуют их, но несвязанные процессы не имеют общих дескрипторов. 200 может относиться к разным файлам в разных процессах. Не знаю, отвечает ли это на ваш вопрос? - person John Kugelman; 11.02.2014
comment
Я немного сбит с толку, что же произойдет, если 200 используется оболочкой где-то еще? Также не понимаю, почему он не использует 3-9, которые определенно не будут использоваться bash, если вы явно не определили его где-то еще ?. Или почему бы не проверить / proc / self / fd перед произвольным назначением? - person Reinstate Monica Please; 11.02.2014
comment
Единственное, чего мне все еще не хватает, это то, что, хотя flock -xn 200 вызывается после 200>/var/lock/mylockfile, к тому времени не /var/lock/mylockfile был закрыт, и, таким образом, файловый дескриптор 200 больше не связан с файл в этом процессе? Итак, как flock узнать, что 50, например, не использовалось для создания файла с самого начала. Вроде бы с ошибкой типа flock: 50: Bad file descriptor. - person quickshiftin; 11.02.2014
comment
200> применяется ко всему, что указано в круглых скобках. /var/lock/mylockfile не закрывается, пока не будет завершена вся суб-оболочка. Файловый дескриптор 200 будет по-прежнему открыт при запуске flock, и, поскольку дочерние процессы наследуют файловые дескрипторы своих родителей, он также может писать в fd 200. - person John Kugelman; 11.02.2014
comment
Я немного сбит с толку, что же произойдет, если 200 используется оболочкой где-то еще? В нормальных условиях в сценарии оболочки открыты только 0, 1 и 2. Можно безопасно писать сценарии, предполагая, что это единственные открытые дескрипторы. Вот почему я говорю, что было бы (довольно) безопасно использовать здесь 3 вместо 200. - person John Kugelman; 11.02.2014
comment
Спасибо, Джон, очень полезно. У меня все еще есть способы развиваться с моими навыками написания сценариев BASH, но я добираюсь туда. - person quickshiftin; 11.02.2014
comment
@JohnKugelman Правильно, маловероятно, что скрипт откроет их, но не может оболочка использовать их для чего-то еще (например, моя оболочка в настоящее время также использует 255), а страница руководства bash имеет перенаправления с использованием файловых дескрипторов больше 9 следует использовать с осторожностью, так как они могут конфликтовать с файловыми дескрипторами, которые оболочка использует для внутренних целей. Хотя, возможно, я неправильно понимаю, как это работает. - person Reinstate Monica Please; 11.02.2014