В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Организация файловой системы
Задавая аргумент изменение_режима служебной программы 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.