Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

Вызовы 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. Параметры этих процедур должны состоять из списка каталогов и набора аргументов командной строки.

5.3.2. Доступ к аргументам, передаваемым при вызове exec

Любая программа может получить доступ к аргументам активизировавшего ее вызова exec через параметры, передаваемые ей. Эти параметры описаны в модуле syslinux следующим образом:

var

argc:integer;

argv:ppchar;

envp:ppchar;

Такое описание должно быть знакомо большинству программистов на Си, так как похожий метод используется для доступа к аргументам командной строки при обычном старте программы – еще один признак того, что командный интерпретатор также использует для запуска процессов вызов exec. (Несколько предшествующих примеров и упражнений были составлены с учетом того, что читателям книги известен метод получения программой параметров ее командной строки. Ниже эта тема будет рассмотрена подробнее.)

В вышеприведенном определении значение переменной argc равно числу аргументов, переменная argv указывает на массив самих аргументов, а переменная envp – на массив строк окружения. Поэтому, если программа запускается на выполнение при помощи вызова execvp следующим образом:

const

argin:array [0..3] of pchar = ('команда', 'с', 'аргументами', nil);

execvp('prog', argin);

то в программе prog будут истинны следующие выражения (выражения вида argv[х] = 'ххх' следует считать фигуральным равенством, а не выражением языка Паскаль):

При использовании модуля syslinux

При использовании модуля system

argc = 3

paramcount = 2

argv[0] = 'команда'

paramstr(0) = 'команда'

argv[1] = 'с'

paramstr(1) = 'с'

argv[2] = 'аргументами'

paramstr(2) = 'аргументами'

argv[3] = nil

paramstr(3) = nil

В качестве простой иллюстрации этого метода рассмотрим следующую программу, которая печатает свои аргументы, за исключением нулевого, на стандартный вывод:1

а) с применением модуля system:

(* Программа myecho - вывод аргументов командной строки *)

var

i:integer;

begin

for i:=1 to paramcount do

write(paramstr(i), ' ');

writeln;

end.

б) с применением модуля syslinux:

(* Программа myecho - вывод аргументов командной строки *)

uses syslinux;

var

i:integer;

begin

for i:=1 to argc-1 do

write(argv[i], ' ');

writeln;

end.

Если вызвать эту программу в следующем фрагменте кода

const

argin:array [0..3] of pchar = ('myecho', 'hello', 'world', nil);

execvp(argin[0], argin);

то переменная argc в программе myecho будет иметь значение 3, и в результат на выходе программы получим:

hello world

Тот же самый результат можно получить при помощи команды оболочки:

$ ./myecho hello world

Упражнение 5.4. Напишите программу waitcmd, которая выполняет произвольную команду при изменении файла. Она должна принимать в качестве аргументов командной строки имя контролируемой файла и команду, которая должна выполняться в случае его изменения. Для слежения за файлом можно использовать вызов fstat. Программа не должна расходовать напрасно системные ресурсы, поэтому следует использовать процедуру sleep (представленную в упражнении 2.16), для приостановки выполнения программы waitcmd в течение заданного интервала времени, после того как она проверит файл. Как должна действовать программа, если файл изначально не существует?

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal