9.1.4.2. Функции-оболочки: execl() и др.
9.1.4.2. Функции-оболочки: execl() и др.
Пять дополнительных функций, действующих в качестве оболочек, предоставляют более удобные интерфейсы для execve(). В первой группе все принимают список аргументов, каждый из которых передается в виде явного параметра функции:
int execl(const char *path, const char *arg, ...)
Первый аргумент, path, является путем к исполняемому файлу. Последующие аргументы, начиная с arg, являются отдельными элементами, которые должны быть помещены в argv. Как и ранее, явным образом должен быть включен argv[0]. Вы должны в качестве последнего аргумента передать завершающий указатель NULL, чтобы execl() смогла определить, где заканчивается список аргументов. Новая программа наследует любые переменные окружения, которые находятся в переменной environ.
int execlp(const char *file, const char *arg, ...)
Эта функция подобна execl(), но она имитирует механизм поиска команд оболочки, разыскивая file в каждом каталоге, указанном в переменной окружения PATH. Если file содержит символ /, этот поиск не осуществляется. Если PATH в окружении не присутствует, execlp() использует путь по умолчанию. В GNU/Linux по умолчанию используется ":/bin:/usr/bin", но в других системах может быть другое значение. (Обратите внимание, что ведущее двоеточие в PATH означает, что сначала поиск осуществляется в текущем каталоге.)
Более того, если файл найден и имеет право доступа на исполнение, но не может быть исполнен из-за того, что неизвестен его формат, execlp() считает, что это сценарий оболочки и запускает оболочку с именем файла в качестве аргумента.
int execle(const char *path, const char *arg, ...,
char *const envp[])
Эта функция также подобна execl(), но принимает дополнительный аргумент, envp, который становится окружением новой программы. Как и в случае с execl(), вы должны для завершения списка аргументов поместить перед envp указатель NULL.
Вторая группа функций-оболочек принимает массив в стиле argv:
int execv(const char *path, char *const argv[])
Эта функция подобна execve(), но новая программа наследует любое окружение, которое находится в переменной environ текущей программы.
int execvp(const char *file, char *const argv[])
Эта функция подобна execv(), но она осуществляет такой же поиск в PATH, как и функция execlp(). Она также переходит на исполнение сценария оболочки, если найденный файл не может быть исполнен непосредственно.
В табл. 9.1 подведены итоги для шести функций exec().
Таблица 9.1. Сводка семейства функций exec() по алфавиту
Функция Поиск пути Окружение пользователя Назначение execl() ? Исполняет список аргументов. execle() Исполняет список аргументов с окружением. execlp() ? ? Исполняет список аргументов с поиском пути execv() ? Исполняет с argv execve() Исполняет с argv и окружением (системный вызов). execvp() ? ? Исполняет с argv и с поиском путиФункций execlp() и execvp() лучше избегать, если вы не знаете, что переменная окружения PATH содержит приемлемый список каталогов.