Язык программирования C

Скачать в pdf «Язык программирования C»


Проиллюстрируем сказанное, написав программу под названием fsize. Эта программа— особая разновидность Is, выводящая размеры всех файлов, перечисленных в списке ее аргументов командной строки. Если один из файлов оказывается каталогом, fsize применяет сама себя рекурсивно к этому каталогу. Если аргументов нет вообще, программа работает с текущим каталогом.


Начнем с краткого обзора устройства файловой системы Unix. Каталогом (directory) в ней называется файл, содержащий список имен файлов и информацию об их местоположении. Эта информация представляет собой ссылку на другую таблицу — список файловых индексов. Файловый индекс (inode) представляет собой структуру данных, содержащую всю информацию о файле, кроме его имени. Каждый пункт списка файлов в каталоге обычно состоит из имени файла и соответствующего номера индекса.


К сожалению, формат и точное содержание файла-каталога меняется от одной версии системы к другой. Поэтому разделим задачу на составные части и попытаемся изолировать непереносимые фрагменты. На внешнем уровне определяется структура Dirent и три функции, opendir, readdir и closedir, которые обеспечивают системнонезависимый доступ к имени и номеру индекса в списке каталога. Функция fsize будет написана с применением этого интерфейса. Затем будет показано, как реализовать эти средства в системах, имеющих ту же структуру каталогов, что и системы Unix Version 7 и System 5. Проработку вариантов оставляем читателю в качестве упражнения.


Структура Dirent содержит номер индекса и имя. Максимальная длина компоненты, соответствующей имени, равна NAME_MAX и зависит от реализации системы. Функция opendir возвращает указатель на структуру DIR, аналогичную FILE, которая используется в readdir и closedir. Вся эта информация собрана в файле dirent. h:


#define NAME_MAX 14    /* самая длинная компонента имени */


/* системно-зависимая */

Скачать в pdf «Язык программирования C»