Linux программирование в примерах
Для простоты можете использовать статический (
) буфер, содержимое которого перезаписывается при каждом вызове процедуры.static2. Доработайте
, чтобы она вызывалаch05-catdir.cдля каждого найденного имени файла. Затем выведите номер индекса, результат вызоваstat(), число ссылок и имя файла.fmt_mode()3. Доработайте
так, что если файл является символической ссылкой, программа будет также выводить имя указываемого файла.ch05-catdir.c4. Добавьте такую опцию, что если имя файла является именем подкаталога, программа рекурсивно входит в него и отображает сведения о файлах (и каталогах) этого подкаталога. Необходим лишь один уровень рекурсии.
5. Если вы не работаете на системе GNU/Linux, запустите
(см. раздел 5.2 «Создание и удаление каталогов») на своей системе и сравните результаты с приведенными нами.ch05-trymkdir6. Напишите программу
. Посмотрите свою локальную справочную страницу для mkdir(1) и реализуйте все ее опции.mkdir7. В корневом каталоге,
, как номер устройства, так и номер индекса для '/' и '.' совпадают. Используя эту информацию, напишите программу...pwdВначале программа должна найти имя текущего каталога, прочитав содержимое родительского каталога. Затем она должна продолжить собирать сведения о иерархии файловой системы, пока не достигнет корневого каталога.
Отображение имени каталога в обратном порядке, от текущего каталога до корневого, легко. Как будет справляться ваша версия
с выводом имени каталога правильным образом, от корневого каталога вниз?pwd8. Если вы написали
, использовав рекурсию, напишите ее снова, использовав итерацию. Если вы использовали итерацию, напишите ее с использованием рекурсии. Что лучше? (Подсказка: рассмотрите очень глубоко вложенные деревья каталогов.)pwd9. Тщательно исследуйте функцию
(см. раздел 5.5.3.1 «Подделкаrpl_utime()»). Какой ресурс не восстанавливается, если одна из проверок в серединеutime(file, NULL)не выполняется? (Спасибо Джеффу Колье (Geoff Collyer).)if10. (Трудное) Прочтите страницу справки для chmod(1). Напишите код для анализа аргумента символических опций, который позволяет добавлять, удалять и устанавливать права доступа на основе владельца, группы, других и «всех».
Когда вы решите, что это работает, напишите свою собственную версию
, которая применяет назначенные права доступа к каждому файлу или каталогу, указанному в командной строке. Какую функцию вы использовали,chmod— илиchmod()иopen()— и почему?fchmod()Глава 6
Общие библиотечные интерфейсы — часть 1
В главе 5 «Каталоги и служебные данные файлов» мы видели, что непосредственное чтение каталога возвращает имена файлов в том порядке, в каком они хранятся в каталоге. Мы также видели, что
содержит всю информацию о файле за исключением его имени. Однако, некоторые компоненты этой структуры не могут использоваться непосредственно; они являются просто числовыми значениями.struct statВ данной главе представлена оставшаяся часть API, необходимая для полного использования значений компонентов
. Мы по порядку рассматриваем следующие темы: значенияstruct statдля представления времени и функций форматирования времени; функции сортировки и поиска (для сортировки имен файлов или других данных); типыtime_tиuid_tдля представления пользователей, групп и функций, которые сопоставляют их с соответствующими именами пользователей и групп; и наконец, функцию для проверки того, что дескриптор файла представляет терминал.gid_t6.1. Времена и даты
Значения времени хранятся в типе, который известен как
. Стандарт ISO С гарантирует, что это числовой тип, но во всем остальном никак не указывает, чем именно он является (целым или с плавающей точкой), как и не указывает степень точности хранящихся в нем значений.time_tНа системах GNU/Linux и Unix значения
представляют «секунды с начала Эпохи». Эпоха представляет собой начало записываемого времени, которое относится к полночи 1 января 1970 г. по UTC. На большинстве системtime_tявляетсяtime_tС. Для 32-разрядных систем это означает, чтоlong intпереполнится 19 января 2038 г. К тому времени, мы надеемся, типtime_tбудет переопределен как по меньшей мере 64-разрядное значение.time_tДля получения текущего времени, вычисления разницы между двумя значениями
, преобразования значенийtime_tв более удобное представление и форматирования обоих представлений в виде символьных строк существуют различные функции. Вдобавок, представление даты и времени можно преобразовать обратно вtime_t, доступна также ограниченная информация по часовым поясам.time_tОтдельный набор функций предоставляет доступ к текущему времени с разрешением, большим чем одна секунда. Функции работают с предоставлением двух различных значений, времени в виде секунд с начала Эпохи и числа микросекунд в текущей секунде. Эти функции описаны далее в разделе 14.3.1 «Время в микросекундах:
».gettimeofday()6.1.1. Получение текущего времени:
иtime()difftime()Системный вызов
получает текущие дату и время;time()вычисляет разницу между двумя значениямиdifftime():time_t#include <time.h> /* ISO С */time_t time(time_t *t);double difftime(time_t time1, time_t time0);возвращает текущее время. Если параметрtime()не равенt, переменная, на которую указываетNULL, также заполняется значением текущего времени. Функция возвращаетt, если была ошибка, устанавливая(time_t)(-1).errnoХотя ISO С не указывает, чем является значение
, POSIX определяет, что оно представляет время в секундах. Поэтому это предположение является обычным и переносимым. Например, чтобы посмотреть, что значение времени представляет отметку в прошлом шесть месяцев назад или позже, можно использовать код, подобный этому:time_t