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

3.3.1. Подробнее о вызове chmod

Системный вызов fstat расширяет использование вызова chmod, поскольку позволяет предварительно узнать значение кода доступа к файлу, что дает возможность изменять отдельные биты, а не менять весь код доступа целиком.

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

(* Программа addx разрешает доступ на выполнение файла *)

uses linux,stdio;

const XPERM=0100; (* Право на выполнение для владельца *)

var

k:integer;

statbuf:tstat;

begin

(* Выполнить для всех файлов в списке аргументов *)

for k := 1 to paramcount do

begin

(* Получить текущий код доступа к файлу *)

if not fstat(paramstr(k), statbuf) then

begin

writeln('addx: ошибка вызова stat для ',paramstr(k));

continue;

end;

(*

Попытаться разрешить доступ на выполнение

при помощи оператора побитового ИЛИ

*)

statbuf.mode := statbuf.mode or octal(XPERM);

if not chmod (paramstr(k), statbuf.mode) then

writeln('addx: ошибка изменения прав доступа для файла ', paramstr(k));

end; (* Конец цикла *)

halt(0);

end.

Наиболее интересный момент заключается здесь в способе изменения кода доступа файла при помощи побитового оператора ИЛИ. Это гарантирует, что устанавливается бит, заданный определением XPERM. Фактически мы могли бы расписать этот оператор в виде:

statbuf.mode := statbuf.mode or octal(XPERM);

Для ясности использована более короткая форма. Можно было бы также использовать вместо XPERM предусмотренную в системе постоянную STAT_IXUSR.

Упражнение 3.11. Приведенную задачу можно решить проще. Если вы знаете, как это сделать, напишите эквивалент этой программы при помощи командного интерпретатора.

Упражнение 3.12. Напишите свою версию команды chmod, используя ее описание в справочном руководстве вашей системы UNIX.

Глава 4. Каталоги, файловые системы и специальные файлы

4.1. Введение

В двух предыдущих главах внимание было сконцентрировано на основном компоненте файловой структуры UNIX – обычных файлах. В этой главе будут рассмотрены другие компоненты файловой структуры, а именно:

  • каталоги. Каталоги выступают в качестве хранилища имен файлов и, следовательно, позволяют пользователям группировать произвольные наборы файлов. Понятие каталогов должно быть знакомо большинству пользователей UNIX и многим «эмигрантам» из других операционных систем. Далее будет показано, что каталоги UNIX могут быть вложенными, это придает структуре файлов древовидную иерархическую форму;

  • файловые системы. Файловые системы представляют собой набор каталогов и файлов и являются подразделами иерархического дерева каталогов и файлов, образующих общую файловую структуру UNIX. Файловые системы обычно соответствуют физическим разделам (partitions) дискового устройства или всему дисковому устройству. При решении большинства задач файловые системы остаются невидимыми для пользователя;

  • специальные файлы. Концепция файла получила в системе UNIX дальнейшее развитие и включает в себя присоединенные к системе периферийные устройства. Эти периферийные устройства, такие как принтеры, дисковые накопители и даже системная память, представляются в файловой структуре именами файлов. Файл, представляющий устройство, называется специальным файлом (special file). К устройствам можно получить доступ при помощи обычных системных вызовов доступа к файлам, описанных в главах 2 и 3 (например, вызовов fdopen, fdread и fdwrite). Каждый такой вызов задействует код драйвера устройства в ядре системы, отвечающий за управление заданным устройством. Тем не менее программе не нужно ничего знать об этом, так как система позволяет обращаться со специальными файлами почти как с обычными.

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