Опубликован: 15.06.2004 | Уровень: специалист | Доступ: платный
Лекция 4:

Организация файловой системы

Задавая аргумент изменение_режима служебной программы chmod   владельца файла обозначают буквой u, владеющую группу - буквой g, прочих пользователей - o. Добавлению прав соответствует знак +, их удаление помечается знаком -. Знак = обозначает буквальное задание прав (для указанной категории пользователей устанавливается указанный режим доступа ). После букв, определяющих категорию пользователей, и знака операции следуют сами добавляемые (удаляемые, устанавливаемые) режимы доступа - обычно r, w и/или x ; можно указать несколько подобных связок, разделяя их запятыми (без пробелов).

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

chmod go-w,u+x myfile
Листинг 4.26. Пример использования служебной программы chmod.

Как указывалось выше, для удобства программирования аналогичных действий на языке C в заголовочном файле   <sys/stat.h> определены константы, соответствующие битам режима файлов. Например, S_IRUSR соответствует праву на чтение для владельца, S_IRWXG охватывает все три бита режима доступа для владеющей группы и т.п. С помощью побитных операций с текущим режимом файла и этими константами можно сформировать требуемое значение аргумента mode функции chmod() (см. листинг 4.27).

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
/* Программа добавляет права на выполнение для файлов - аргументов командной строки */
int main (int argc, char *argv[]) {
 struct stat buf;
 int i;

 for (i = 1; i < argc; i++) {
   if (stat (argv [i], &buf)) {
     fprintf (stderr, "\nstat: не удалось получить информацию о файле %s\n", argv [i]);
     return (-1);
   }
 
   if (chmod (argv [i], buf.st_mode | S_IXUSR | S_IXGRP | S_IXOTH)) {
     fprintf (stderr, "\nchmod: не удалось изменить режим доступа к файлу %s\n", argv [i]);
     return (-1);
   }
 }

 return 0;
}
Листинг 4.27. использования функций stat() и chmod().

За счет рационального выбора режимов доступа можно сделать невозможными большинство ошибочных операций с файлами (например, их удаление или изменение посторонними пользователями), не ограничивая свободы осмысленных действий.

В число атрибутов файла входят показатели времени последнего доступа и/или изменения (см. выше описание структуры stat ). Обычно их модификация осуществляется как побочный эффект операций с файлами, но они устанавливаются и явным образом с помощью служебной программы touch:

touch  [-am] [-r эталонный_файл | -t время]
       [-c] файл ...

Опция -a предписывает модифицировать время последнего доступа, опция -m - время последнего изменения; если не задана ни одна из них, выполняется и то, и другое.

Устанавливаемое время может быть текущим (если не заданы опции -r и -t ), наследоваться у эталонного_файла или задаваться явно как аргумент опции -t. В последнем случае оно должно иметь вид

[[CC]YY]MMDDhhmm[.SS]

Пары цифр указывают, соответственно, на две старшие цифры года, две младшие цифры года, месяц в году, номер дня в месяце, час в дне, минуту в часе и секунду в минуте.

(Любопытны правила формирования старших цифр года, если они опущены. Когда младшие цифры лежат в диапазоне от 69 до 99, подразумевается 19; в противном случае - 20. Несомненно, в будущих версиях стандарта данное соглашение изменится.)

Если файл-аргумент не существует, он создается по умолчанию служебной программой touch. Опция -c запрещает делать это.

Приведем пример совместного использования служебных программ touch, chown и chmod. В процессе загрузки ОС Linux выполняются действия по инициализации файлов с информацией о пользовательских сеансах, подобные тем, что приведены в листинге 4.28.

> /var/run/utmp
touch /var/log/wtmp
chown :utmp /var/run/utmp /var/log/wtmp
chmod ug=rw,o=r /var/run/utmp /var/log/wtmp
Листинг 4.28. использования совместного утилит touch, chown и chmod.

Здесь полезны обе возможности touch - и модификация атрибутов существующих файлов, и создание новых.

Часто touch применяют при работе с файлами-замками (см. листинг 4.29).

start () {
 echo -n "Starting cupsd: "
 daemon cupsd
 RETVAL=$?
 echo
 [ $RETVAL = 0 ] && touch /var/lock/subsys/cups
 return $RETVAL
}
Листинг 4.29. Пример использования утилиты touch для работы с файлами-замками при загрузке ОС Linux.
Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?

Ирина Воскресенская
Ирина Воскресенская
Россия, Москва, НИЯУ МИФИ
Максим Баранов
Максим Баранов
Россия