Доступ к аргументам, передаваемым при вызове 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 |
В качестве простой иллюстрации этого метода рассмотрим следующую программу, которая печатает свои аргументы, за исключением нулевого, на стандартный вывод:[5]
а) с применением модуля 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 в течение заданного интервала времени, после того как она проверит файл. Как должна действовать программа, если файл изначально не существует?