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

Описание

uses stdio;

function getsid(pid:longint):longint;

Если передать вызову getsid значение 0, то он вернет идентификатор сеанса вызывающего процесса, в противном случае возвращается идентификатор сеанса процесса, заданного идентификатором pid.

Понятие сеанса полезно при работе с фоновыми процессами или процессами-демонами (daemon processes). Процессом-демоном называется просто процесс, не имеющий управляющего терминала. Примером такого процесса является процесс cron, запускающий команды в заданное время. Демон может задать для себя сеанс без управляющего терминала, переместившись в другой сеанс при помощи системного вызова setsid.

Описание

uses stdio;

function setsid:longint;cdecl;

Если вызывающий процесс не является лидером группы процессов, то создается новая группа процессов и новый сеанс, и идентификатор вызывающего процесса станет идентификатором созданного сеанса. Он также не будет иметь управляющего терминала. Процесс-демон теперь будет находиться в странном состоянии, так как он будет единственным процессом в группе процессов, содержащейся в новом сеансе, а его идентификатор процесса pid – также идентификатором группы и сеанса.

Функция setsid может завершиться неудачей и возвратит значение -1, если вызывающий процесс уже является лидером группы.

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

Программное окружение (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.

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