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

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

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

В System III (примерно в 1980-м) команды

cp
,
ln
и
mv
представляли один исполняемый файл с тремя ссылками с этими именами в
/bin
. Программа проверяла
argv[0]
и решала, что она должна делать. Это сохраняло некоторое количество дискового пространства за счет усложнения исходного кода и форсирования выполнения программой действия по умолчанию при запуске с неизвестным именем. (Некоторые современные коммерческие системы Unix продолжают эту практику!) Без явной формулировки причин GNU Coding Standards рекомендует, чтобы программы не основывали свое поведение на своем имени. Одна причина, которую мы видели, состоит в том, что администраторы часто устанавливают GNU версию утилиты наряду со стандартной версией коммерческих систем Unix, используя префикс g:
gmake
,
gawk
и т.д. Если такие программы ожидают лишь стандартные имена, они при запуске с другим именем потерпят неудачу.

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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