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