учебники, программирование, основы, введение в,

 

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

Основные понятия.
В трактовке стандарта POSIX понятие файла охватывает все, что может содержать, потреблять и/или поставлять информацию. В объектно-ориентированной терминологии файл должен предоставлять методы для чтения и/или записи и иметь такие атрибуты, как тип, имя и режим.
В стандарте зафиксированы следующие типы файлов:

  • обычный файл;
  • каталог;
  • канал;
  • символьный специальный файл;
  • блочный специальный файл;
  • символьная ссылка;
  • сокет.

Обычный файл представляет собой последовательность байт с возможностью случайного доступа и без какой-либо дополнительной структуры, наложенной операционной системой.
Каталог состоит из элементов (ссылок), ассоциирующих имена с файлами. Одинаковые имена не могут фигурировать в разных элементах одного каталога, но разные элементы могут ссылаться на один и тот же файл.
Канал можно представлять себе в виде транспортера, с одной стороны которого находится поставщик (процесс, пишущий в канал), а с другой - потребитель (процесс, читающий из канала). Данные читаются в том же порядке, в каком производилась запись, т. е. с точки зрения структур данных канал - это очередь.
Специальные файлы соответствуют аппаратным компонентам компьютера. Обычно при использовании символьных специальных файлов остаются видимыми аппаратные характеристики соответствующих устройств, а при доступе к устройствам посредством блочных специальных файлов аппаратные характеристики, как правило, остаются скрытыми. Типичный пример устройства, которому соответствует символьный специальный файл, - терминал.
Символьная ссылка - это файл, хранящий цепочку символов. Когда подобный файл является компонентом маршрутного имени (см. далее), хранимая цепочка символов влияет на результирующий маршрут. Обычно ссылка раскрывается (прозрачным для приложений образом), т. е. вместо ее имени подставляется содержимое (цепочка символов).
Сокет - это оконечная точка межпроцессных коммуникаций.
Файлы вместе со служебной информацией, хранящейся в объектах, которые называются описателями файлов, объединяются в иерархическую структуру (направленный граф), именуемую файловой системой. Все неконцевые вершины графа (т. е. вершины, откуда выходит хотя бы одна дуга) являются каталогами; все концевые имеют другие типы.
Согласно стандарту POSIX-2001, для каждого процесса определен корневой каталог с именем / - вершина графа, из которой осуществляется доступ к прочим файлам данной файловой системы. "Абсолютного", единого для всех корня может и не существовать.
В пределах файловой системы каждый файл имеет уникальный идентификатор (порядковый номер - он же номер описателя файла).
Имена, ассоциируемые с файлами (точнее, с их порядковыми номерами) посредством каталогов, называются простыми. С формальной точки зрения они могут включать любые символы, кроме слэша (/), однако для повышения мобильности приложений стандарт рекомендует ограничиться латинскими буквами, цифрами, а также символами ., _, - (точка, подчеркивание, минус), причем минус не должен быть первым символом. В соответствующей стандарту операционной системе сохраняется различие между большими и малыми буквами.
(При использовании в именах файловнекоторых других символов довольно часто возникают проблемы. Укажем лишь на часть из них.
Символы национальных алфавитов создают трудности с отображением имен. Символы, имеющие специальный смысл для командного интерпретатора, могут вызвать неожиданные и нежелательные модификации имен. Символ : (двоеточие) в имени каталога способен нарушить нормальную интерпретацию значения переменной окружения PATH. Минус в качестве первого символа придает имени файла вид комбинации опций, нарушая процесс разбора аргументов утилит. И т.д, и т.п.)
В каждом каталоге должны присутствовать имена . (точка) и .. (по стандарту читается как точка-точка), которые трактуются как ссылки на текущий и вышележащий каталоги. Для корневого каталога имя .. может также ссылаться на корень.
Под маршрутным именем понимается цепочка символов, идентифицирующая файл и состоящая из нескольких (в том числе из нуля) простых имен файлов, разделенных символами / и называемых компонентами маршрута.   Маршрутные имена, начинающиеся символом /, называются абсолютными, они задают маршрут от корня файловой системы. (Отметим, что стандарт POSIX-2001 определяет трактовку маршрутных имен, начинающихся с двух символов /, как зависящую от реализации. В частности, таким способом в некоторых ОС задаются имена файлов на других хостах сети.)
Прочие имена называются относительными, маршрут в них задан относительно текущего каталога.
Маршрутным префиксом называется маршрутное имя, ссылающееся на каталог. Если маршрутное имя оканчивается символом /, оно обязано быть маршрутным префиксом.
Маршрутные имена называют также составными   именами файлов. Примеры составных имен:
/.autofsck
/usr/lib/tcl
../susv3
./l4.txt
Первые два имени являются абсолютными. файл   .autofsck лежит в корневом каталоге, файл   tcl - в подкаталоге lib подкаталога usr   корневого каталога. Третье и четвертое - относительные имена, специфицирующие, соответственно, файл   susv3, расположенный в иерархии на один уровень выше файлов   текущего каталога, и файл   l4.txt из текущего каталога. Последнее маршрутное имя можно было задать и проще:
l4.txt
Стандарт POSIX определяет процесс разрешения маршрутных имен, компонентами которых являются символьные ссылки. Если такая ссылка - последний компонент, а затребованная функция относится к самой ссылке, имя остается без изменений. В противном случае ссылка раскрывается: вместо соответствующего компонента подставляется хранимая цепочка символов, и процесс разрешения маршрутного имени продолжается. Если он зацикливается или нарушает какие-либо ограничения (например, на длину маршрутного имени или количество раскрытых ссылок), операционная система должна зафиксировать ошибку.
Согласно стандарту, с каждым файлом ассоциирована по крайней мере следующая служебная информация:

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

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

  • владелец файла;
  • члены владеющей группы;
  • прочие пользователи.

Для каждой из них режим доступа определяет права на операции с файлом, а именно:

  • право на чтение;
  • право на запись;
  • право на выполнение (для каталогов - право на поиск).

Указанных видов прав достаточно, чтобы определить допустимость любой операции с файлами. Например, для удаления файла необходимо иметь право на запись в соответствующий каталог (если не используется бит ограничения на удаление элементов каталогов).
Стандарт POSIX предусматривает реализацию дополнительных и/или альтернативных механизмов контроля доступа в операционной системе. Дополнительные механизмы ужесточают стандартный контроль, альтернативные заменяют его.
Выполнение большинства операций с файлами требует их открытия. Открытому файлу соответствует файловый дескриптор - неотрицательное целое число, уникальное в пределах процесса и используемое для целей доступа к файлу. Дескриптор является ссылкой на описание открытого файла, хранящее смещение в файле, его статус, режимы доступа. Разные дескрипторы могут ссылаться на одно описание.
Вероятно, все версии ОС Unix поддерживают понятие монтирования - отождествление корня дополнительной файловой системы с некоторым каталогом в существующей иерархии (этот каталог называется точкой монтирования) и формирования таким образом объединенной файловой системы. В стандарте POSIX-2001 понятие монтирования, равно как и необходимые для его поддержки служебные программы и функции, отсутствуют. Причина - зависимость от реализации.
Получение информации о файлах и файловых системах
Чтобы узнать абсолютное маршрутное имя   текущего каталога, приложение может воспользоваться упоминавшейся ранее обычной встроенной командой языка shell
pwd  [-L | -P]
#include <unistd.h>
char *getcwd (char *buf, size_t size);
Листинг 4.1. Описание функции getcwd().
Команда pwd с (подразумеваемой) опцией -L извлекает имя текущего каталога из переменной окружения PWD, если это возможно. Посредством опции -P выполняется раскрытие символьных ссылок: в выдаваемом на стандартный вывод абсолютном маршрутном имени вместо символьных ссылок подставляется их содержимое.
Функция getcwd() помещает абсолютное маршрутное имя   текущего каталога (без символьных ссылок) в массив buf длины size, который и возвращается в качестве результата (при ошибке результат равен NULL).
Приведем пример программы, использующей функцию getcwd().
Листинг 4.2. Пример использования функции getcwd().
Обратим внимание на применение функции pathconf(), возвращающей текущее значение одного из конфигурируемых параметров целевой системы - в данном случае максимальную длину маршрутного имени. Подобный прием характерен для мобильных приложений.
Для выдачи на стандартный вывод информации о файлах всех типов служит утилита
ls  [опция ...] [файл ...]
(напомним, что в квадратные скобки заключаются необязательные аргументы). Как правило, если в качестве файла задано имя каталога, то выводится информация обо всех содержащихся в нем файлах.
Опции управляют порядком и степенью подробности выдаваемой информации о файлах. Если опции не заданы, выводятся только имена файлов. Если не заданы файлы, выдается информация о файлах   текущего каталога. Опция -l предписывает выводить подробную информацию. Например, при использовании служебной программы ls по команде
ls -l /
может быть выдано следующее:
Пример 4.3. Возможный результат использования служебной программы ls
Число в первой строке есть суммарный размер (в блоках по 512 байт) всех файлов   каталога, информация о которых выдана. Далее следуют строки с информацией об отдельных файлах. Первый символ в этих строках задает тип файла:

  • d - каталог;
  • b - блочный специальный файл;
  • c - символьный специальный файл;
  • l - символьная ссылка;
  • p - канал;
  • - (минус) - обычный файл.

Отметим, что стандартом POSIX-2001 не предусмотрено обозначение для сокетов, указано только, что реализации могут вводить свои типы файлов и обозначения для них.
Девять последующих символов отражают режим доступа к файлу: первые три символа - права доступа его владельца, следующие три - владеющей группы, последние три - права доступа прочих пользователей. Наличие буквы r (чтение), w (запись) или x (выполнение) означает, что соответствующее право имеется; знак минус свидетельствует об отсутствии права. Например, файл   /usr является каталогом, куда может писать только пользователь root, а читать и искать информацию - все остальные.
Следом идет число ссылок на файл (считаются только так называемые жесткие ссылки, т. е. количество вхождений имени файла в каталоги). Для каталога оно заведомо не меньше двух (обоснование этого факта предоставляется читателю).
Следующие два столбца - имена владельца файла и владеющей группы, после чего идет размер файла в байтах. Для специальных файлов вместо размера нередко выдается зависящая от реализации информация о соответствующем устройстве.
Наконец, следуют дата и время последнего изменения и имя файла. По умолчанию имена файлов сортируются в алфавитном порядке.
Опишем еще несколько употребительных опций служебной программы ls.


Ключ

Описание

-a

Вывести список всех файлов (обычно не выводятся данные о файлах, имена которых начинаются с точки).

-C

Выдавать имена файлов в несколько столбцов (с сортировкой по столбцам). Отметим, что если в командной строке встречаются пары взаимоисключающих опций (например, -lC), то действует та, что указана последней.

-d

Трактовать каталоги наравне с файлами других типов. Часто используется с опцией -l для получения сведений о состоянии каталога.

-F

Выводить символ / после имен каталогов, * - после выполнимых файлов, | - после каналов, @ - после символьных ссылок.

-i

Выдавать порядковый номер файла в файловой системе (см. выше).

-R

Рекурсивно обойти встретившиеся подкаталоги.

-r

Изменить порядок сортировки файлов на обратный.

-t

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

-L

Если символьная ссылка является аргументом утилиты ls или встретилась в процессе обхода файловой иерархии, выдавать информацию об указуемом файле, а не о ссылке. На месте имени выводится имя файла-ссылки (а не указуемого файла).

-H

Аналогична -L, но воздействует только на символьные ссылки, заданные в командной строке и указывающие на каталог.

http://localhost:3232/img/empty.gifhttp://localhost:3232/img/empty.gifПриведем еще несколько примеров употребления утилиты ls. После выполнения команд, показанных в, наша Linux-система выдает информацию определенного вида :
cd /usr/share/zoneinfo/posix
ls -il UTC Universal Zulu
Листинг 4.4. Еще один пример использования служебной программы ls.
Листинг 4.5. Возможный результат использования служебной программы ls.
Как и предписывает опция -i, выданы порядковые номера (уникальные идентификаторы) файлов. Мы видим, что для всех трех имен они одинаковы (2506763), т. е. эти именассылаются на один и тот же файл. Поскольку выданное утилитой ls число ссылок равно шести, в файловой системе имеются еще три (жесткие) ссылки на данный файл.
Полезно сопоставить команды и результаты, показанные в листингах, с теми, что приведены в листингах.
cd /bin
ls -il ex rvi rview vi view
Листинг 4.6. Применение служебной программы ls для выдачи информации о символьных ссылках.
Листинг 4.7. Возможный результат использования служебной программы ls при выдаче информации о символьных ссылках.
Все пять файлов - аргументов командной строки (четыре символьные ссылки и один обычный файл) имеют разные порядковые номера и, следовательно, являются разными файлами (на каждый имеется лишь по одной жесткой ссылке). Для символьных ссылок выдана информация о них, а не об указуемых файлах. Если же добавить опцию -L, мы получим сведения об указуемом файле (vi) в пяти экземплярах, но на месте имен будут фигурировать имена символьных ссылок .
Листинг 4.8. Возможный результат использования служебной программы ls при выдаче информации о символьных ссылках и наличии опции -L.
Данные о специальных файлах могут выглядеть так, как показано в.
ls -l /dev/ttyp[0-3] /dev/fd[2-5]
Листинг 4.9. Пример использования служебной программы ls для выдачи информации о специальных файлах.
Листинг 4.10. Возможный результат использования служебной программы ls при выдаче информации о специальных файлах.
Для специальных файлов вместо размера выдаются так называемые старший и младший номера, однозначно определяющие соответствующее устройство; наличие такой возможности, разумеется, зависит от реализации.
Сведения о файлах-каналах могут выглядеть так, как показано в.
Листинг 4.11. Возможный результат использования служебной программы ls при выдаче информации о каналах.
В приведен пример вывода информации о сокетах.
Листинг 4.12. Возможный результат использования служебной программы ls при выдаче информации о сокетах.
Опция -t позволяет увидеть сначала те файлы, которые изменялись позже других. Например, командная строка служебной программы ls
ls -tl /
может выдать следующую информацию:
Листинг 4.13. Возможный результат использования служебной программы ls с сортировкой файлов по времени последнего изменения.
Видеть в первую очередь самые свежие файлы полезно в тех случаях, когда программная система перестала работать и нужно найти причину поломки, а для этого требуется прежде всего точно узнать, что же, собственно, изменилось.
При программировании на языке C информацию о файлах получают с помощью функций семейства stat().
#include <sys/stat.h>
int stat (const char *restrict path,
struct stat *restrict buf);
#include <sys/stat.h>
int fstat (int fildes, struct stat *buf);
#include <sys/stat.h>
int lstat (const char *restrict path,
struct stat *restrict buf);
Листинг 4.14. Описание функций семейства stat().
Обратим внимание на использование в описании функций stat() и lstat() ключевого слова restrict из репертуара C99. Оно означает, что по указателям-аргументам доступ осуществляется к непересекающимся областям памяти. Подобная спецификация расширяет оптимизационные возможности компилятора.
Функция stat() предоставляет информацию о поименованном файле: аргумент path указывает на маршрутное имя файла. Чтобы получить эти сведения, достаточно иметь право на поиск для всех компонентов маршрутного префикса. Функция fstat() сообщает данные об открытом файле, задаваемом дескриптором файла   fildes. Функция lstat() эквивалентна stat() за одним исключением: если аргумент path задает символьную ссылку, lstat() возвращает информацию о ней, а stat() - о файле, на который эта ссылка указывает.
В случае нормального завершения результат функций семейства stat() равен 0.
Аргумент buf является указателем на структуру типа stat, в которую помещается информация о файле. Согласно стандарту POSIX-2001, в ней содержатся по крайней мере следующие поля:
dev_t    st_dev;  
/* Идентификатор устройства, содержащего файл */
ino_t    st_ino;  
/* Порядковый номер файла в файловой системе */
mode_t   st_mode; 
/* Режим файла
nlink_t  st_nlink;
/* Число жестких ссылок на файл */
uid_t    st_uid;  
/* Идентификатор владельца файла */
gid_t    st_gid;  
/* Идентификатор владеющей группы */
off_t    st_size; 
/* Для обычных файлов и символьных ссылок -
размер в байтах */
/* Для файлов других типов значение этого поля
неспецифицировано */
time_t   st_atime;
/* Время последнего доступа */
time_t   st_mtime;
/* Время последнего изменения файла */
time_t   st_ctime;
/* Время последнего изменения статуса файла */
Некоторые пояснения. Комбинация значений (st_dev, st_ino) должна однозначно определять файл в пределах объединенной (в том числе сетевой) файловой системы. Статус файла меняется, когда модифицируются его атрибуты (например, режим), а не содержимое.
В файле   <sys/stat.h> определена не только структура stat, но и константы, полезные для работы с битами режима. Так, S_IFMT выделяет тип файла, S_IFREG обозначает обычные файлы, S_IRWXU - биты режима доступа владельцаи т.д.
Приведем пример использования функций stat() и lstat() .
Листинг 4.15. Пример использования функций stat() и lstat().
Возможный результат работы этой программы с аргументами /bin/view и /bin/vi показан в.
Листинг 4.16. Возможный результат работы программы, использующей функции stat() и lstat().
http://localhost:3232/img/empty.gifhttp://localhost:3232/img/empty.gifДля получения интегральной информации о файловых системах, содержащих заданные файлы, следует воспользоваться служебной программой
df  [опция ...] [файл ...]
или функциями fstatvfs() или statvfs().
#include <sys/statvfs.h>
int fstatvfs (int fildes,
struct statvfs *buf);
int statvfs (const char *restrict path,
struct statvfs *restrict buf);
Листинг 4.17. Описание функций fstatvfs() и statvfs().
Утилита df выдает на стандартный вывод информацию об имеющемся пространстве и, возможно, некоторые другие данные. Если файлы-аргументы не указаны, поступают сообщения обо всех компонентах объединенной файловой системы.
По умолчанию пространство измеряется в 512-байтных блоках; опция -k предписывает использовать блоки размером в килобайт. Подразумеваемый формат вывода не специфицирован, но должны становиться известными по крайней мере имя файловой системы и объем свободного пространства. Если задана опция -P, употребляется так называемый мобильный формат вывода с заголовком
Filesystem  512-blocks  Used Available
Capacity Mounted on
и следующей построчной информацией о каждой файловой системе:

  • имя файловой системы;
  • общее пространство;
  • занятое пространство;
  • свободное пространство;
  • процент занятости;
  • корень файловой системы (точка монтирования в объединенной файловой системе).

Возможный результат выполнения служебной программы df с опциями -kP приведен в.
Листинг 4.18. Возможный результат выполнения командной строки df -kP.
Пара функций statvfs() и fstatvfs() по интерфейсу аналогична функциям stat() и fstat(), только в выходную структуру (типа fstatvfs) помещается информация не о файлах, а о файловых системах, содержащих эти файлы. Согласно стандарту POSIX-2001, в структуре statvfs должны присутствовать по крайней мере следующие поля:
unsigned long f_bsize;   
/* Размер блока файловой системы */
unsigned long f_frsize;  
/* Базовый размер блока файловой системы */
fsblkcnt_t    f_blocks;  
/* Общее число блоков базового размера в
файловой системе */
fsblkcnt_t    f_bfree;   
/* Общее число свободных блоков */
fsblkcnt_t    f_bavail;  
/* Число свободных блоков, доступных
непривилегированным процессам */
fsfilcnt_t    f_files;   
/* Общее число описателей файлов */
fsfilcnt_t    f_ffree;   
/* Общее число свободных описателей файлов */
fsfilcnt_t    f_favail;  
/* Число описателей файлов, доступных
непривилегированным процессам */
unsigned long f_fsid;    
/* Идентификатор файловой системы */
unsigned long f_flag;    
/* Битная шкала флагов */
unsigned long f_namemax; 
/* Максимальная длина имени файла */
Среди флагов, входящих в шкалу f_flag, выделим ST_RDONLY - признак того, что файловая система   смонтирована только на чтение.
В приведен исходный текст программы, которая выдает сведения о файловых системах, содержащих заданные в командной строке файлы-аргументы.
Листинг 4.19. Пример использования функции statvfs().
Если смонтировать   файловую систему FAT на каталог   /a с опцией "только на чтение", то результат выполнения приведенной программы с аргументами / и /a может выглядеть так, как показано в.
Листинг 4.20. Возможный результат работы программы, использующей функцию statvfs().
Интерпретация полученных результатов предоставляется читателю.
Служебная программа
du  [опция ...] [файл ...]
выдает информацию о суммарном объеме пространства (измеряемого аналогично df), занятого иерархиями файлов с указанными в командной строке корнями, предваряя ее аналогичными сведениями для каждого из подкаталогов, входящих в иерархии. При отсутствии аргументов выводятся сведения о текущем каталоге. Файлы, на которые есть несколько жестких ссылок, учитываются только один раз. Символьные ссылки трактуются по сути так же, как и в служебной программе ls, включая смысл опций -H и -L.
Выделим несколько других опций.


Ключ

Описание

-a

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

-s

Вместо подразумеваемого вывода информировать только о суммарном объеме занятого пространства для каждой заданной в командной строке иерархии.

Пример. В ответ на команду
du -k /usr/local/man /bin/vi /bin/view
может быть выдано следующее :
1428    /usr/local/man/man1
12  /usr/local/man/man5
64  /usr/local/man/man7
36  /usr/local/man/man8
1544    /usr/local/man
384 /bin/vi
0   /bin/view
Листинг 4.21. Возможный результат использования утилиты du.
Таким образом, иерархия файлов с корнем в /usr/local/man занимает около 1.5 Мб (почти все приходится на долю файлов подкаталога man1), обычный файл   /bin/vi - 384 Кб (читателю предлагается сопоставить эту величину и приведенный выше размер данного файла в байтах), символьная ссылка лишнего места не занимает.

http://localhost:3232/img/empty.gifhttp://localhost:3232/img/empty.gifИзменение атрибутов файлов и текущей позиции в файловой иерархии

Для смены текущего каталога (т. е. начальной точки маршрутов, не начинающихся символом /) служат упоминавшаяся ранее обычная встроенная команда языка shell
cd  [-L | -P] [целевой_каталог]
cd  -
и функция chdir():
#include <unistd.h>
int chdir (const char *path);
Команда cd без аргументов осуществляет переход в домашний каталог пользователя, заданный переменной окружения HOME. Если аргументом является минус, выполняются действия, показанные в: осуществляется переход в каталог, ранее бывший текущим, и в случае успеха выводится его абсолютное маршрутное имя.
cd "$OLDPWD" && pwd
Листинг 4.22. Действия, выполняемые по команде cd -.
Алгоритм работы команды cd, как ни странно, довольно сложен и содержит целый ряд тонкостей. Сначала, если целевой каталог задан относительным маршрутным именем, выполняется преобразование к абсолютному формату. При этом:

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

Затем выполняется раскрытие символьных ссылок и устранение имен "точка" и "точка-точка" ("точка" уничтожается вместе со следующим за ней символом /, "точка-точка" - вместе с предыдущим компонентом, отличным от "точки-точки", и символом / между ними). Опции команды cd влияют на порядок выполняемых действий. По опции -P сначала раскрываются символьные ссылки. Это значит, что "точка-точка" трактуется как физический надкаталог (каталог, вышележащий по отношению к указуемому файлу). При наличии (подразумеваемой) опции -L порядок действий обратный; в результате "точка-точка" обозначает логический надкаталог (каталог, вышележащий по отношению к символьной ссылке, а не к указуемому файлу).
Наконец, выполняется переход по результирующему маршруту.
В случае успешной смены текущего каталога соответственно изменяются значения переменных окружения $OLDPWD (текущий каталог непосредственно перед выполнением команды cd) и $PWD (текущий каталог после выполнения команды cd).
Рассмотрим пример выполнения команды cd с разными опциями.
Возможный результат показан в.
ls -dl /usr/tmp /var/tmp
cd /usr/tmp
pwd
pwd -P
cd ..
pwd
cd -
cd -P ..
pwd
Пример 4.23. Пример выполнения команды cd с разными опциями
Пример 4.24. результат выполнения команд cd с разными опциями
Можно видеть, что /usr/tmp является символьной ссылкой на каталог   /var/tmp. При варьировании опций команды pwd   каталог   /usr/tmp по-разному отображается в качестве текущего (напомним, опция -P команды pwd вызывает раскрытие символьных ссылок). По-разному срабатывает и команда cd с целевым каталогом "точка-точка", опцией -P и без таковой. В результате видно различие между физическим и логическим надкаталогами символьной ссылки.
Для изменения атрибутов файлов служат утилиты
chown  [-R] [-H | -L | -P ] владелец[:группа]
файл ...
(смена владельца и, быть может, владеющей группы файла) и
chmod  [-R] изменение_режима файл ...
(модификация режима файла), а также аналогичные им по назначению и именам функции.
#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).
http://localhost:3232/img/empty.gifhttp://localhost:3232/img/empty.gifЗадавая аргумент изменение_режима служебной программы chmod   владельца файла обозначают буквой u, владеющую группу - буквой g, прочих пользователей - o. Добавлению прав соответствует знак +, их удаление помечается знаком -. Знак = обозначает буквальное задание прав (для указанной категории пользователей устанавливается указанный режим доступа). После букв, определяющих категорию пользователей, и знака операции следуют сами добавляемые (удаляемые, устанавливаемые) режимы доступа - обычно r, w и/или x; можно указать несколько подобных связок, разделяя их запятыми (без пробелов).
Пусть, например, все могут читать и изменять файл myfile. Чтобы отнять право на запись у владеющей группы и прочих пользователей и одновременно добавить себе право на выполнение, владельцу следует воспользоваться командой, показанной в.
chmod go-w,u+x myfile
Листинг 4.26. Пример использования служебной программы chmod.
Как указывалось выше, для удобства программирования аналогичных действий на языке C в заголовочном файле   <sys/stat.h> определены константы, соответствующие битам режима файлов. Например, S_IRUSR соответствует праву на чтение для владельца, S_IRWXG охватывает все три бита режима доступа для владеющей группы и т.п. С помощью побитных операций с текущим режимом файла и этими константами можно сформировать требуемое значение аргумента mode функции chmod() (см.).
Листинг 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 запрещает делать это.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика