Запуск нескольких функций bash в фоновом режиме и ожидание их возврата

Возможно ли, что программа уже его использует

Нет. Видите ли, перенаправление ввода-вывода происходит до запуска программы или сценария.

Обычно при запуске программы или сценария открываются только стандартные дескрипторы (0 / стандартный ввод, 1 / стандартный вывод и 2 / стандартная ошибка). (Они могут относиться к терминалу, устройству, файлу или даже сетевому сокету; но предполагается, что они будут открытыми. Вместо того, чтобы «закрывать» один, мы перенаправляем нежелательный дескриптор из / в / dev / null , по сути «нигде» / «ничего».)

Программы используют дескрипторы через системные вызовы, такие как open , которые используют свободный дескриптор. То есть они не просят ядро ​​открыть файл или сокет для определенного дескриптора , ядро ​​выбирает дескриптор. Итак, единственный случай, когда программа использует дополнительный дескриптор, - это когда ожидается, что он уже открыт при запуске программы. Есть несколько таких редких служебных демонов, как этот - в дополнение к стандартным дескрипторам они ожидают, что если, например, дескриптор 3 открыт при запуске, он связан с их службой управления (или чем-то подобным).

Если программа решает использовать жестко запрограммированный дескриптор (и единственная причина, по которой это будет сделано, это то, что она разветвляет и выполняет другую программу, которая ожидает, что этот дескриптор будет открыт; как я уже сказал, это очень редко), уже открытый дескриптор закрывается, когда программа заменяет его тем, для чего они его используют.(Ядро, кстати, закрывает, когда программа указывает, что они хотят использовать определенный дескриптор, например, dup2 () в системах POSIXy; процессу не нужно заботиться.)

Shell сценарии (Bash и sh) используют фиксированные номера дескрипторов, поэтому вполне возможно, что сценарий использует определенный дескриптор для выполнения некоторых перенаправлений ввода / вывода. Однако, когда это происходит, предыдущие перенаправления просто игнорируются и имеют нет эффекта, потому что сценарии предполагают, что дескриптор был закрыт. (Если дескриптор открыт, и скрипт использует этот дескриптор для некоторых внутренних вещей, исходный дескриптор сначала закрывается - ядром, и по причинам, упомянутым в предыдущем абзаце - когда скрипты перенаправляют его. Чтобы произошла утечка данных, сценарий должен был бы специально проверить , если дескриптор уже открыт, и избегать его перенаправления.)

Также обратите внимание, что модули или каналы ввода-вывода Fortran не связаны с дескрипторами, даже если оба используют номер для идентификации. Итак, даже если программа на Фортране использует модуль 10, это не означает, что она использует дескриптор 10.

Безопасно ли для этого просто использовать фиксированный номер fd?

Да. POSIX утверждает, что в программе может быть открыто не менее 20 дескрипторов, поэтому любое фиксированное число от 3 до 19 должно работать нормально.

Ключевой момент - это хорошо документировать, желательно в коротком комментарии в начале скрипта (для скриптов) или в использовании ( -h или - help параметр командной строки) и справочную страницу (для программ).

Что касается скриптов, вы можете предположить, что если возникнет конфликт (а если они возникнут, то это будет разновидность «скрипт не работает вообще, потому что канал закрывается, как только программа запускается», как описано выше), пользователи могут изменить фиксированный номер дескриптора в соответствии со своими потребностями. Итак, ваша задача как сценариста - спланировать наперед и облегчить задачу тем, кто придет после. (Достаточно четкого комментария, описывающего ваши намерения и общий дизайн; нет необходимости делать номер дескриптора переменной или описывать каждое маленькое действие, которое делает скрипт.)

Для программ это хорошая идея. настраиваемый во время выполнения. Например, ваша программа / демон может использовать дескриптор 3, если он открыт, для специального протокола управления с графическим пользовательским интерфейсом; но, используя какой-либо параметр командной строки, например '-c 5', используйте именованный дескриптор (или, с -c / dev / name или -c named-pipe или -c: путь к сокету использовать указанный файл, именованный канал или сокет локального домена). Таким образом, пользователи могут легко обойти любые конфликты со скриптами.

14
09.08.2016, 13:53
0 ответов

Теги

Похожие вопросы