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

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

Изменение атрибутов файлов и текущей позиции в файловой иерархии

Для смены текущего каталога (т. е. начальной точки маршрутов, не начинающихся символом / ) служат упоминавшаяся ранее обычная встроенная команда языка shell

cd  [-L | -P] [целевой_каталог]
cd  -

и функция chdir():

#include <unistd.h>
int chdir (const char *path);

Команда cd без аргументов осуществляет переход в домашний каталог пользователя, заданный переменной окружения HOME. Если аргументом является минус, выполняются действия, показанные в листинге 4.22: осуществляется переход в каталог, ранее бывший текущим, и в случае успеха выводится его абсолютное маршрутное имя.

cd "$OLDPWD" && pwd
Листинг 4.22. Действия, выполняемые по команде cd -.

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

  • если имя начинается с точки или точки-точки, перед ним подставляется значение переменной окружения $PWD и / ;
  • в других случаях вместо $PWD подставляются элементы списка, являющегося значением переменной окружения $CDPATH и устроенного аналогично $PATH ; процесс продолжается до тех пор, пока не получится существующий каталог ; в случае необходимости в последнюю очередь используется значение $PWD.

Затем выполняется раскрытие символьных ссылок и устранение имен "точка" и "точка-точка" ("точка" уничтожается вместе со следующим за ней символом /, "точка-точка" - вместе с предыдущим компонентом, отличным от "точки-точки", и символом / между ними). Опции команды cd влияют на порядок выполняемых действий. По опции -P сначала раскрываются символьные ссылки. Это значит, что "точка-точка" трактуется как физический надкаталог ( каталог, вышележащий по отношению к указуемому файлу ). При наличии (подразумеваемой) опции -L порядок действий обратный; в результате "точка-точка" обозначает логический надкаталог ( каталог, вышележащий по отношению к символьной ссылке, а не к указуемому файлу ).

Наконец, выполняется переход по результирующему маршруту.

В случае успешной смены текущего каталога соответственно изменяются значения переменных окружения $OLDPWD ( текущий каталог непосредственно перед выполнением команды cd ) и $PWD ( текущий каталог после выполнения команды cd ).

Рассмотрим пример выполнения команды cd с разными опциями (см. листинг 4.23).

Возможный результат показан в листинге 4.24.

ls -dl /usr/tmp /var/tmp
cd /usr/tmp
pwd
pwd -P
cd ..
pwd
cd -
cd -P ..
pwd
4.23. Пример выполнения команды cd с разными опциями
lrwxrwxrwx    1 root     root           10 Jul  6 14:16 /usr/tmp -> ../var/tmp
drwxrwxrwt    5 root     root         4096 Sep  4 18:05 /var/tmp
/usr/tmp
/var/tmp
/usr
/usr/tmp
/var
4.24. результат выполнения команд cd с разными опциями

Можно видеть, что /usr/tmp является символьной ссылкой на каталог   /var/tmp. При варьировании опций команды pwd   каталог   /usr/tmp по-разному отображается в качестве текущего (напомним, опция -P команды pwd вызывает раскрытие символьных ссылок ). По-разному срабатывает и команда cd с целевым каталогом "точка-точка", опцией -P и без таковой. В результате видно различие между физическим и логическим надкаталогами символьной ссылки.

Для изменения атрибутов файлов служат утилиты

chown  [-R] [-H | -L | -P ] владелец[:группа] 
       файл ...

(смена владельца и, быть может, владеющей группы файла) и

chmod  [-R] изменение_режима файл ...

(модификация режима файла ), а также аналогичные им по назначению и именам функции (см. листинг 4.25).

#include <unistd.h>
int chown (const char *path, uid_t owner, 
           gid_t group);
#include <unistd.h>
int fchown (int fildes, uid_t owner, 
            gid_t group);
#include <sys/stat.h>
int chmod (const char *path, mode_t mode);
#include <sys/stat.h>
int fchmod (int fildes, mode_t mode);
Листинг 4.25. Описание функций chown(), fchown(), chmod() и fchmod().

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

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

Опции -R, -H и -L имеют в целом тот же смысл, что и для утилиты ls (см. выше): первая предписывает рекурсивный обход встретившихся подкаталогов, две другие - выборочное или полное раскрытие символьных ссылок, указывающих на каталоги. Опция -P означает, что изменения относятся к самим символьным ссылкам.

Если при использовании функций chown() и fchown() меняется лишь владелец, то аргумент group задается равным ( gid_t ) (-1); при смене только группы идентификатор владельца следует задать как ( uid_t ) (-1).

Антон Коновалов
Антон Коновалов

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