Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
Отметим, что мы передаем реальное имя пути программы (/bin/ls), а затем имя программы еще раз в качестве первого аргумента. Это делается для поддержки программ, которые ведут себя по-разному в зависимости от того, под каким именем они были вызваны.
Например, GNU-утилиты компрессии и декомпрессии (gzip и gunzip) фактически привязаны к одному и тому же исполняемому модулю. Когда исполняемый модуль стартует, он анализирует аргумент argv[0] (передаваемый функции main) и принимает решение, следует ли выполнять
Варианты с суффиксом «е» передают программе окружение. Окружение — это только своего рода «контекст», в котором работает программа. Например, у вас может быть программа проверки орфографии, у которой есть эталонный словарь. Вместо описания каждый раз в командной строке местоположения словаря вы могли бы сделать это в окружении:
Команда
Если вы когда-либо хотели бы использовать различные словари, вы были бы должны изменить среду до выполнения программы. Это просто сделать из оболочки:
Но как сделать это из ваших собственных программ? Для того чтобы применять «e»-версии функций spawn и exec, вам следует определить массив строк, представляющих собой окружение:
Версии с суффиксом «p» будут искать исполняемый модуль программы в списке каталогов, приведенном в переменной окружения PATH. Вы, вероятно, отметили, что во всех примерах местоположение исполняемых модулей строго определено —
Это сообщает командному интерпретатору, что когда я набираю команду, он в первую очередь должен просмотреть каталог
Если вы не знаете путь к выполнимой программе, вы можете использовать варианты с суффиксом «p».
Например:
Если функция execl не сможет найти
А что произойдет, если сделать так?
Выполняет ли этот вызов поиск в окружении? Нет. Вы явно указали execlp имя пути, что отменяет правило поиска в PATH. Если
Опасно ли смешивать явный путь с простым именем команды (например, указывать путь как
• значительное число программ так или иначе игнорирует
• те программы, поведение которых зависит от их имени, обычно вызывают функцию basename, которая удаляет каталоговую часть
Единственная обоснованная причина использования полного имени пути в качестве первого параметра заключается в том, что программа может выводить диагностические сообщения, содержащие этот первый параметр, который немедленно укажет вам, откуда она была вызвана. Это может быть важно, если копии программы располагаются в нескольких каталогах из перечисленных в PATH.
Функции семейства spawn имеют дополнительный параметр; во всех приведенных выше примерах я всегда указывал P_WAIT. Имеются четыре флага, которые вы можете придать функции spawn, чтобы изменить ее поведение: