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

Описание

uses dos;

Function GetEnv(EnvVar:String):String;

Аргументом функции getenv является имя искомой переменной. При успешном завершении поиска функция getenv возвращает указатель на строку переменной окружения, в противном случае – пустая строка. Следующий код показывает пример использования этой функции:

(* Найти значение переменной окружения PATH *)

uses dos;

begin

writeln('PATH=',getenv('PATH'));

end.

Для изменения окружения существует парная процедура putenv. Она вызывается следующим образом:

putenv('НОВАЯ_ПЕРЕМЕННАЯ = значение');

В случае успеха процедура putenv возвращает нулевое значение. Она изменяет переменную окружения, на которую указывает глобальная переменная envp.

5.10.6. Текущий рабочий каталог

Как было установлено в главе 4, с каждым процессом связан текущий рабочий каталог. Первоначально текущий рабочий каталог наследуется во время создавшего процесс вызова fork или exec. Другими словами, процесс первоначально помещается в тот же каталог, что и родительский процесс.

Важным фактом является то, что текущий рабочий каталог является атрибутом отдельного процесса. Если дочерний процесс меняет каталог при помощи вызова chdir (определение которого приведено в главе 4), то текущий рабочий каталог родительского процесса не меняется. Поэтому стандартная команда cd на самом деле является «встроенной» командой оболочки, а не программой.

5.10.7. Текущий корневой каталог

С каждым процессом также связан корневой каталог, который используется при поиске абсолютного пути. Так же, как и текущий рабочий каталог, корневым каталогом процесса первоначально является корневой каталог его родительского процесса. Для изменения начала иерархии файловой системы для процесса в ОС UNIX существует системный вызов chroot:

Описание

uses stdio;

function chroot(path:pchar):longint;

Переменная path указывает на путь, обозначающий каталог. В случае успешного вызова chroot путь path становится начальной точкой при поиске в путях, начинающихся с символа / (только для вызывающего процесса, корневой каталог системы при этом не меняется). В случае неудачи вызов chroot не меняет корневой каталог и возвращает значение -1. Для изменения корневого каталога вызывающий процесс должен иметь соответствующие права доступа.

Упражнение 5.12. Добавьте к командному интерпретатору smallsh команду cd.

Упражнение 5.13. Напишите собственную версию функции getenv.

5.10.8. Идентификаторы пользователя и группы

С каждым процессом связаны истинные идентификаторы пользователя и группы. Это всегда идентификатор пользователя и текущий идентификатор группы запустившего процесс пользователя.

Действующие идентификаторы пользователя и группы используются для определения возможности доступа процесса к файлу. Чаще всего, эти идентификаторы совпадают с истинными идентификаторами пользователя и группы. Равенство нарушается, если процесс или один из его предков имеет установленные биты доступа set-user-id или set-group-id. Например, если для файла программы установлен бит set-user-id, то при запуске программы на выполнение при помощи вызова ехес действующим идентификатором пользователя становится идентификатор владельца файла, а не запустившего процесс пользователя.

Для получения связанных с процессом идентификаторов пользователя и группы существует несколько системных вызовов. Следующий фрагмент программы демонстрирует их:

uses linux;

var

uid, euid, gid, egid : longint;

begin

(* Получить истинный идентификатор пользователя *)

uid := getuid;

(* Получить действующий идентификатор пользователя *)

euid := geteuid;

(* Получить истинный идентификатор группы *)

gid := getgid;

(* Получить действующий идентификатор группы *)

egid := getegid;

end.

Для задания действующих идентификаторов пользователя и группы процесса также существуют два вызова:

uses stdio;

var

newuid, newgid:longint;

.

.

.

(* Задать действующий идентификатор пользователя *)

status := setuid(newuid);

(* Задать действующий идентификатор группы *)

status := setgid(newgid);

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

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

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