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

       

Переменные программного окружения


Программное окружение (environment) процесса – это просто набор строк, заканчивающихся нулевым символом, представленных в программе просто в виде массива указателей на строки. Эти строки называются переменными окружения (environment variables). По принятому соглашению, каждая строка окружения имеет следующую форму:

имя переменной = ее содержание

В модуле dos определены функция envcount, возвращающие количество строк окружения, и функция envstr, возвращаю строку окружения с заданным номером. Можно напрямую использовать программное окружение процесса с помощью массива envp из модуля syslinux.

В качестве простого примера следующая программа просто выводит свое окружение и завершает работу.

а) с использованием модуля dos:

(* Программа showmyenv.pas - вывод окружения *)

uses dos;

var

  i:integer;

begin

  for i:=1 to envcount do

    writeln(envstr(i));

end.



б) с использованием модуля syslinux:

(* Программа showmyenv.pas - вывод окружения *)

uses syslinux;

var

  i:integer;

begin

  i:=0;

  while envp[i]<>nil do

  begin

    writeln(envp[i]);

    inc(i);

  end;

end.

При запуске этой программы на одной из машин были получены следующие результаты:

CDPATH=:..:/

HOME=/usr/keith

LOGNAME=keith

MORE=-h -s

PATH=/bin:/etc:/usr/bin:/usr/cbin:/usr/lbin

SHELL=/bin/ksh

TERM=vti00

TZ=GMTOBST

Этот список может быть вам знакомым. Это окружение процесса командного интерпретатора (оболочки), вызвавшего программу showmyenv, и оно включает

такие важные переменные, как HOME и PATH.

Пример показывает, что по умолчанию окружение процесса совпадает с окружением процесса, создавшего его при помощи вызова fork или ехес. Поскольку окружение передается указанным способом, то можно записывать в окружении информацию, которую иначе пришлось бы задавать заново для каждого нового процесса. Переменная окружения TERM, в которой записан тип текущего терминала, является хорошим примером того, насколько полезным может быть использование окружения.

Чтобы задать для процесса новое окружение, необходимо использовать для его запуска один из двух вызовов из семейства exec: execle или execve. Они вызываются следующим образом:

execle(path, envp);

и:

execve(path, argv, envp);

Эти вызовы дублируют соответственно вызовы

execv и execl. Единственное различие заключается в добавлении параметра envp, который является заканчивающимся нулевым символом массивом строк, задающим окружение новой программы. Следующий пример использует вызов

execle для передачи нового программного окружения программе showmyenv:

(* Программа setmyenv.pas - установка окружения программы *)

uses linux,stdio;

const

  argv:array [0..1] of pchar=('showmyenv',nil);

  envp:array [0..2] of pchar=('foo=bar','bar=foo',nil);

begin

  execve ('./showmyen', argv, envp);

  perror ('Ошибка вызова execve');

end.

Для поиска в переменной envp имени переменной окружения, заданной в форме name=string, можно использовать стандартную библиотечную функцию getenv.



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