Пять дополнительных функций, действующих в качестве оболочек, предоставляют более удобные интерфейсы для 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()
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
содержит приемлемый список каталогов.9.1.4.3. Имена программ и argv[0]
До сих пор мы все время считали argv[0]
/
, в зависимости от способа вызова программы, если этот символ содержится, это хорошая подсказка к тому, что для вызова программы использовалось имя пути.Однако, как должно быть ясно к этому времени, то, что argv[0]
argv[0]
произвольной строки. Следующая программа, ch09-run.c
, демонстрирует передачу произвольной строки:1 /* ch09-run.c --- запуск программы с другим именем и любыми аргументами */
2
3 #include
4 #include
5 #include
6
7 /* main --- настроить argv и запустить указанную программу */
8
9 int main(int argc, char **argv)
10 {
11 char *path;
12
13 if (argc < 3) {
14 fprintf(stderr, "usage: %s path arg0 [ arg ... ]\n", argv[0]);
15 exit(1);
16 }
17
18 path = argv[1];
19