Вызовы execv, execlp и execvp
Другие формы вызова ехес упрощают задание списков параметров запуска загружаемой программы. Вызов execv принимает два аргумента: первый (path в описании применения вызова) является строкой, которая содержит полное имя и путь к запускаемой программе. Второй аргумент (argv) является массивом строк, определенным как:
argv:ppchar;
Первый элемент этого массива указывает, по принятому соглашению, на имя запускаемой программы (исключая префикс пути). Оставшиеся элементы указывают на все остальные аргументы программы. Так как этот список имеет неопределенную длину, он всегда должен заканчиваться нулевым указателем.
Следующий пример использует вызов execv для запуска той же программы ls, что и в предыдущем примере:
(* Программа runls2 - использует вызов execv для запуска ls *)
uses linux,stdio;
const
av: array [0..2] of pchar=('ls', '-l', nil);
begin
execv ('/bin/ls', av);
(* Если мы оказались здесь, то произошла ошибка *)
perror ('execv failed');
halt(1);
end.
Функции execlp и execvp почти эквивалентны функциям execl и execv. Основное отличие между ними состоит в том, что первый аргумент обоих функций execlp и execvp – просто имя программы, не включающее путь к ней. Путь к файлу находится при помощи поиска в каталогах, заданных в переменной среды PATH. Переменная PATH может быть легко задана на уровне командного интерпретатора с помощью следующих команд:
$ PATH = /bin:/usr/bin:/usr/keith/mybin
$ export PATH
Теперь командный интерпретатор и вызов
execvp будут вначале искать команды в каталоге /bin, затем в /usr/bin, и, наконец, в /usr/keith/mybin.
Упражнение 5.2. В каком случае нужно использовать вызов execv вместо execl?
Упражнение 5.3. Предположим, что вызовы execvp и execlp не существуют. Напишите эквиваленты этих процедур, используя вызовы execl и execv. Параметры этих процедур должны состоять из списка каталогов и набора аргументов командной строки.