Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

В табл. 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]
не обязательно должен иметь какое-нибудь отношение к файлу, который в действительности запускается.

  • Читать дальше
  • 1
  • ...
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: