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

3.1.7. Изменение прав доступа при помощи вызова chmod Описание

uses linux;

Function Chmod(PathName:Pathstr; NewMode:Longint):Boolean;

Для изменения прав доступа к существующему файлу применяется системный вызов chmod. Вызов разрешен владельцу файла или суперпользователю.

Параметр pathname указывает имя файла. Параметр newmode содержит новый код доступа файла, образованный описанным в первой части главы способом.

Пример использования вызова chmod:

if not chmod(pathname, octal(0644)) then

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

Упражнение 3.7. Напишите программу setperm, которая имеет два аргумента командной строки. Первый – имя файла, второй – набор прав доступа в восьмеричной форме или в форме, выводимой команда ls. Если файл существует, то программа setperm должна попытаться поменять права доступа к файлу на заданные. Используйте процедуру lsoct, которую вы разработали в упражнении 3.3.

3.1.8. Изменение владельца при помощи вызова chown

Вызов chown используется для изменения владельца и группы файла.

Описание

uses linux;

Function Chown(PathName:Pathstr; Owner_id,Group_id:Longint):Boolean;

Например:

Uses linux;

Var UID,GID : Longint;

F : Text;

begin

Writeln ('This will only work if you are root.');

Write ('Enter a UID : ');readln(UID);

Write ('Enter a GID : ');readln(GID);

Assign (f,'test.txt');

Rewrite (f);

Writeln (f,'The owner of this file should become : ');

Writeln (f,'UID : ',UID);

Writeln (f,'GID : ',GID);

Close (F);

if not Chown ('test.txt',UID,GID) then

if LinuxError=Sys_EPERM then

Writeln ('You are not root !')

else

Writeln ('Chmod failed with exit code : ',LinuxError)

else

Writeln ('Changed owner successfully !');

end.

Вызов имеет три аргумента: pathname, указывающий имя файла, owner_id, задающий нового владельца, и group_id, задающий новую группу. Возвращаемое значение retval равно true в случае успеха и false – в случае ошибки.

В системе, удовлетворяющей спецификации XSI, вызывающий процесс должен быть процессом суперпользователя или владельца файла (точнее, действующий идентификатор вызывающего процесса должен либо совпадать с идентификатором владельца файла, либо быть равным 0). При несанкционированной попытке изменить владельца файла выставляется код ошибки Sys_EPERM.

Поскольку вызов chown разрешен текущему владельцу файла, обычный пользователь может передать свой файл другому пользователю. При этом пользователь не сможет впоследствии отменить это действие, так как идентификатор пользователя уже не будет совпадать с идентификатором пользователя файла. Следует также обратить внимание на то, что при смене владельца файла в целях предотвращения неправомерного использования вызова chown для получения системных полномочий, сбрасываются права доступа set-user-id и set-group-id. (Что могло бы произойти, если бы это было не так?)

3.2. Файлы с несколькими именами

Любой файл UNIX может иметь несколько имен. Другими словами, один и тот же набор данных может быть связан с несколькими именами UNIX без необходимости создания копий файла. Поначалу это может показаться странным, но для экономии свободного пространства на диске и увеличения числа пользователей, использующих один и тот же файл, – весьма полезно.

Каждое такое имя называется жесткой ссылкой (hard link). Число связанных с файлом ссылок называется счетчиком ссылок (link count).

Новая жесткая ссылка создается при помощи системного вызова link, а существующая жесткая ссылка может быть удалена при помощи системного вызова unlink.

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

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