Linux программирование в примерах - Роббинс Арнольд
Шрифт:
Интервал:
Закладка:
3043 /* Время считается недавним, если оно в пределах последних 6
3044 месяцев. В Григорианском годе 365.2425 * 24 * 60 * 60 ==
3045 31556952 секунд в среднем. Запишите это значение как
3046 целую константу для избежания трудностей с плавающей точкой.*/
3047 six_months_ago = current_time - 31556952 / 2;
Сравните это с нашим примером вычисления шести прошлых месяцев. Каковы преимущества и недостатки каждого из методов?
3. Напишите простую версию команды touch, которая изменяет время модификации файла, имя которого указано в командной строке, на текущее время
4. Добавьте к вашей команде touch опцию, которая принимает в командной строке значения даты и времени и использует их в качестве нового времени модификации файлов, указанных в командной строке.
5. Добавьте к своей версии touch еще одну опцию, которая принимает имя файла и использует время модификации данного файла как новое время модификации файла, указанного в командной строке.
6. Усовершенствуйте ch06-sortemp.c так, чтобы она сортировала отдельный массив указателей, указывающих на массив сотрудников.
7. Добавьте к ch06-sortdir.c опции для сортировки по номеру индекса, времени модификации, времени доступа и размеру. Добавьте «обратную опцию», так, чтобы основанная на времени сортировка первым помещала самый недавний файл, а по другим критериям (размеру, индексу) помещала вначале наибольшее значение.
8. Напишите простую версию команды chown. Она должна использоваться так:
chown пользователь[:группа] файлы ...
Здесь пользователь и группа являются именами пользователя и группы, представляющими новых пользователя и группу для указанных файлов. Группа необязательна; если она присутствует, она отделяется от пользователя двоеточием. Чтобы протестировать свою версию на системе GNU/Linux, вы должны зарегистрироваться в качестве root. Делайте это осторожно!
9. Усовершенствуйте свою chown, чтобы допустить использование числовых значений пользователя или группы наряду с их именами.
10. Напишите функции для копирования структур пользователя и группы, включая указываемые данные. Для выделения памяти используйте при необходимости malloc().
11. Напишите специализированную библиотеку поиска пользователей, которая считывает в динамически выделяемый массив всю базу данных пользователей. Предусмотрите быстрый поиск пользователей как по ID, так и по именам. Гарантируйте обработку случая, при котором запрошенный пользователь не найден.
12. Сделайте то же самое для базы данных групп.
13. Напишите программу stat, которая печатает содержимое struct stat для каждого файла, указанного в командной строке. Она должна выводить все значения в формате, удобном для восприятия человеком: значения time_t в виде дат и времени, значения uid_t и gid_t в виде соответствующих имен (если они доступны), а также содержимое символических ссылок. Выведите поле st_mode таким же образом, как вывела бы ls.
Сравните свою программу с программой stat GNU Coreutils как по их выводу, так и по исходному коду.
Глава 7
Соединяя все вместе: ls
Команда V7 ls хорошо связывает воедино все, что мы до сих пор видели. Она использует почти все API, которые мы рассмотрели, затрагивая многие аспекты программирования Unix: выделение памяти, вспомогательные данные файлов, времена и даты, имена пользователей, чтение каталогов и сортировку.
7.1. Опции V7 ls
По сравнению с современными версиями ls, V7 ls принимает лишь небольшое количество опций, а значение некоторых из них для V7 отличается от значения для современной ls. Эти опции следующие:
-а Выводит все элементы каталога. Без нее '.' и '..' не выводятся. Довольно интересно, V7 игнорирует лишь '.' и '..', тогда как с V1 по V6 игнорируется любой файл, имя которого начинается с точки. Это последнее является также поведением по умолчанию и для современных версий ls.
-n Вместо времени модификации файла использует для -t или -l время изменения индекса.
-d Для аргументов каталогов выводит сведения о самом каталоге, а не о его содержимом.
-f «Заставляет» читать каждый элемент как каталог и печатать найденное в каждом слоте имя. Эта опция отключает -l, -r, -s, -t и включает -а. (Эта опция, очевидно, существует для отладки и исправления файловой системы.)
-g Для 'ls -l' использует вместо имени пользователя имя группы.
-i Выводит в первом столбце номер индекса вместе с именем файла или длинным листингом.
-l Осуществляет привычный вывод в длинном формате. Обратите, однако, внимание, что V7 'ls -l' выводила лишь имя владельца, а не имена владельца и группы вместе.
-r Изменяет порядок сортировки, будь то по алфавиту для имен файлов или по времени.
-s Выводит размер файла в 512-байтовых блоках. Справочная страница V7 ls(1) утверждает, что вспомогательные блоки (indirect blocks) — блоки, используемые файловой системой для обнаружения блоков больших файлов — также учитываются при вычислении, но, как мы увидим, это утверждение было неверным.
-t Сортирует вывод вместо имени по времени модификации, сначала более ранние.
-u С опциями -t и/или -l использует время доступа вместо времени модификации. Наибольшие различия между V7 ls и современной ls затрагивают опцию -а и опцию -l. Современные системы опускают все файлы с точками, если не указана -а, и они включают в длинный листинг -l имена и владельца, и группы. На современных системах -g означает вывод лишь имени группы, а -o означает вывод лишь имени владельца. Стоит заметить, что у GNU ls свыше 50 опций!