Linux программирование в примерах
9.1.4.2. Функции-оболочки:
и др.execl()Пять дополнительных функций, действующих в качестве оболочек, предоставляют более удобные интерфейсы для
. В первой группе все принимают список аргументов, каждый из которых передается в виде явного параметра функции:execve()int execl(const char *path, const char *arg, ...)Первый аргумент,
, является путем к исполняемому файлу. Последующие аргументы, начиная сpath, являются отдельными элементами, которые должны быть помещены вarg. Как и ранее, явным образом должен быть включенargv. Вы должны в качестве последнего аргумента передать завершающий указательargv[0], чтобыNULLсмогла определить, где заканчивается список аргументов. Новая программа наследует любые переменные окружения, которые находятся в переменнойexecl().environint execlp(const char *file, const char *arg, ...)Эта функция подобна
, но она имитирует механизм поиска команд оболочки, разыскиваяexecl()в каждом каталоге, указанном в переменной окруженияfile. ЕслиPATHсодержит символfile, этот поиск не осуществляется. Если/в окружении не присутствует,PATHиспользует путь по умолчанию. В GNU/Linux по умолчанию используется "execlp()", но в других системах может быть другое значение. (Обратите внимание, что ведущее двоеточие в:/bin:/usr/binозначает, что сначала поиск осуществляется в текущем каталоге.)PATHБолее того, если файл найден и имеет право доступа на исполнение, но не может быть исполнен из-за того, что неизвестен его формат,
считает, что это сценарий оболочки и запускает оболочку с именем файла в качестве аргумента.execlp()int execle(const char *path, const char *arg, ...,char *const envp[])Эта функция также подобна
, но принимает дополнительный аргумент,execl(), который становится окружением новой программы. Как и в случае сenvp, вы должны для завершения списка аргументов поместить передexecl()указательenvp.NULLВторая группа функций-оболочек принимает массив в стиле
:argvint execv(const char *path, char *const argv[])Эта функция подобна
, но новая программа наследует любое окружение, которое находится в переменной environ текущей программы.execve()int execvp(const char *file, char *const argv[])Эта функция подобна
, но она осуществляет такой же поиск вexecv(), как и функцияPATH. Она также переходит на исполнение сценария оболочки, если найденный файл не может быть исполнен непосредственно.execlp()В табл. 9.1 подведены итоги для шести функций
.exec()Таблица 9.1. Сводка семейства функций
по алфавитуexec()
Функция Поиск пути Окружение пользователя Назначение execl()√ Исполняет список аргументов. execle()Исполняет список аргументов с окружением. execlp()√ √ Исполняет список аргументов с поиском пути execv()√ Исполняет с argvexecve()Исполняет с и окружением (системный вызов).argvexecvp()√ √ Исполняет с и с поиском путиargvФункций
иexeclp()лучше избегать, если вы не знаете, что переменная окруженияexecvp()содержит приемлемый список каталогов.PATH9.1.4.3. Имена программ и
argv[0]До сих пор мы все время считали
именем программы. Мы знаем, что оно может содержать, а может и не содержать символargv[0], в зависимости от способа вызова программы, если этот символ содержится, это хорошая подсказка к тому, что для вызова программы использовалось имя пути./Однако, как должно быть ясно к этому времени, то, что
содержит имя файла, является лишь соглашением. Ничто не может воспрепятствовать передаче вами вызываемой программе в качествеargv[0]произвольной строки. Следующая программа,argv[0], демонстрирует передачу произвольной строки:ch09-run.c1 /* ch09-run.c --- запуск программы с другим именем и любыми аргументами */23 #include <stdio.h>4 #include <errno.h>5 #include <unistd.h>67 /* main --- настроить argv и запустить указанную программу */89 int main(int argc, char **argv)10 {11 char *path;