Системное программирование в UNIX средствами Free Pascal

Доступ к аргументам, передаваемым при вызове 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 в течение заданного интервала времени, после того как она проверит файл. Как должна действовать программа, если файл изначально не существует?


Содержание раздела