Шрифт:
В табл. 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 <stdio.h>
4 #include <errno.h>
5 #include <unistd.h>
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
20 execv(path, argv + 2); /* skip argv[0] and argv[1] */
21
22 fprintf(stderr, "%s: execv failed: %s\n", argv[0],
23 strerror(errno));
24 exit(1);
25 }
Первый аргумент является путем к запускаемой программе, а второй аргумент является новым именем для программы (которое большинство утилит игнорируют, кроме сообщений об ошибках); все остальные аргументы передаются вызываемой программе.
Строки 13–16 осуществляют проверку ошибок. Строка 18 сохраняет путь в
path
Строка 20 осуществляет exec
; если программа доходит до строк 22–23, это указывает на ошибку. Вот что происходит при запуске программы:
$ ch09-run /bin/grep whoami foo /* Запустить grep */
a line /* Входная строка не подходит */
a line with foo in it /* Входная строка подходит */
a line with foo in it /* Это выводится */
^D /* EOF */
$ ch09-run nonexistent-program foo bar /* Демонстрация неудачи */
ch09-run: execv failed: No such file or directory
Следующий пример несколько неестественен: мы заставили
ch09-run
запустить себя, передав в качестве имени программы 'foo
'. Поскольку аргументов для второго запуска недостаточно, она выводит сообщение об использовании и завершается:
$ ch09-run ./ch09-run foo
usage: foo path arg [ arg ... ]
Хотя она и не очень полезна,
ch09-run
ясно показывает, что argv[0]
не обязательно должен иметь какое-нибудь отношение к файлу, который в действительности запускается.