Книга: Linux программирование в примерах
Упражнения
Упражнения
1. Напишите простую версию команды date
, которая принимает в командной строке строку формата и использует ее для форматирования и вывода текущего времени.
2. Когда файл старше шести месяцев, 'ls -l
' использует для печати времени изменения более простой формат. GNU версия файла ls.c
использует следующее вычисление:
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 как по их выводу, так и по исходному коду.