Книга: Linux программирование в примерах
5.6. Резюме
5.6. Резюме
• Иерархия файлов и каталогов, как она видится пользователю, является одним логическим деревом, корень которого находится в /
. Оно составлено из одного или более разделов, каждый из которых содержит файловую систему. Внутри файловой системы в индексах хранятся данные о файлах (метаданные), включая размещение блоков данных.
• Каталоги осуществляют связь между именами файлов и индексами. Концептуально содержимое каталога, которое является просто последовательностью пар (индекс, имя). Каждый элемент каталога для файла называется (прямой) ссылкой, а файлы могут иметь множество ссылок. Прямые ссылки, поскольку они работают лишь по номеру индекса, все должны находиться в одной файловой системе. Символические ссылки являются указателями на файлы или каталоги и работают на основе имени файла, а не номера индекса, поэтому их использование не ограничено одной и той же файловой системой.
• Прямые ссылки создаются с помощью link()
, символические ссылки создаются с помощью symlink()
, ссылки удаляются с помощью unlink()
, а переименовываются файлы (с возможным перемещением в другой каталог) с помощью rename()
. Блоки данных файла не освобождаются до тех пор, пока счетчик ссылок не достигнет нуля и не закроется последний открытый дескриптор файла.
• Каталоги создаются с помощью mkdir()
, а удаляются с помощью rmdir()
; перед удалением каталог должен быть пустым (не оставлено ничего, кроме '.
' и '..
'). GNU/Linux версия функции ISO С remove()
вызывает соответствующие функции unlink()
или rmdir()
.
• Каталоги обрабатываются с помощью функций opendir()
, readdir()
, rewinddir()
и closedir()
. struct dirent
содержит номер индекса и имя файла. Максимально переносимый код использует в члене d_name
только имя файла. Функции BSD telldir()
и seekdir()
для сохранения и восстановления текущего положения в каталоге широко доступны, но не полностью переносимы, как другие функции работы с каталогами.
• Вспомогательные данные получаются с помощью семейства системных вызовов stat()
, структура struct stat
содержит всю информацию о файле за исключением имени файла. (В самом деле, поскольку у файла может быть множество имен или он может совсем не иметь ссылок, невозможно сделать имя доступным.)
• Макрос S_ISxxx()
в <sys/stat.h>
дает возможность определить тип файла. Функции major()
и minor()
из <sys/sysmacros.h>
дают возможность расшифровки значений dev_t
, представляющих блочные и символьные устройства.
• Символические ссылки можно проверить, использовав lstat()
, а поле st_size
структуры struct stat
для символической ссылки возвращает число байтов, необходимых для размещения имени указываемого файла. Содержимое символической ссылки читают с помощью readlink()
. Нужно позаботиться о том, чтобы размер буфера был правильным и чтобы завершить полученное имя файла нулевым байтом, чтобы можно было его использовать в качестве строки С.
• Несколько разнообразных системных вызовов обновляют другие данные: семейство chown()
используется для смены владельца и группы, процедуры chmod()
для прав доступа к файлу, a utime()
для изменения значений времени доступа и изменения файла.