Шрифт:
Список аргументов здесь — список аргументов командной строки, передаваемых программе.
Заметьте, что в библиотеке языка Си функции spawnlp, spawnvp и spawnlpe все вызывают функцию spawnvpe, которая, в свою очередь, вызывает POSIX-функцию spawnp. Функции spawnle, spawnv и spawnl все в конечном счете вызывают функцию spawnve, которая затем вызывает POSIX-функцию spawn. И, наконец, POSIX-функция spawnp вызывает POSIX-функцию spawn. Таким образом, в основе всех возможностей семейства spawn лежит сам вызов spawn.
Рассмотрим теперь различные варианты функций spawn и exec более подробно так, чтобы вы смогли получить навык свободного использования различных суффиксов. Затем мы перейдем непосредственно к рассмотрению вызова функции spawn.
Например, если я хочу вызвать команду
Или, вариант с применением суффикса v:
Почему именно такой выбор? Он дан для удобства восприятия. У вас может быть синтаксический анализатор, уже встроенный в вашу программу, и может быть удобно сразу оперировать массивами строк. В этом случае я бы рекомендовал применять варианты с суффиксом «v». Или вам может понадобиться запрограммировать вызов программы, когда вам известно, где он находится и какие имеет параметры. В этом случае, зачем вам утруждать себя созданием массива строк, когда вы знаете точно, какие нужны аргументы? Просто передайте их варианту функции с суффиксом «l».
Отметим, что мы передаем реальное имя пути программы (/bin/ls), а затем имя программы еще раз в качестве первого аргумента. Это делается для поддержки программ, которые ведут себя по-разному в зависимости от того, под каким именем они были вызваны.
Например, GNU-утилиты компрессии и декомпрессии (gzip и gunzip) фактически привязаны к одному и тому же исполняемому модулю. Когда исполняемый модуль стартует, он анализирует аргумент argv[0] (передаваемый функции main) и принимает решение, следует ли выполнять компрессию или декомпрессию.
Варианты с суффиксом «е» передают программе окружение. Окружение — это только своего рода «контекст», в котором работает программа. Например, у вас может быть программа проверки орфографии, у которой есть эталонный словарь. Вместо описания каждый раз в командной строке местоположения словаря вы могли бы сделать это в окружении:
Команда
Если вы когда-либо хотели бы использовать различные словари, вы были бы должны изменить среду до выполнения программы. Это просто сделать из оболочки:
Но как сделать это из ваших собственных программ? Для того чтобы применять «e»-версии функций spawn и exec, вам следует определить массив строк, представляющих собой окружение: