5. Добавьте к своей версии touch
еще одну опцию, которая принимает имя файла и использует время модификации данного файла как новое время модификации файла, указанного в командной строке.
6. Усовершенствуйте ch06-sortemp.c
так, чтобы она сортировала отдельный массив указателей, указывающих на массив сотрудников.
7. Добавьте к ch06-sortdir.c
опции для сортировки по номеру индекса, времени модификации, времени доступа и размеру. Добавьте «обратную опцию», так, чтобы основанная на времени сортировка первым помещала самый
8. Напишите простую версию команды chown
. Она должна использоваться так:
chown пользователь[:группа] файлы ...
Здесь root
. Делайте это осторожно!
9. Усовершенствуйте свою chown
, чтобы допустить использование числовых значений пользователя или группы наряду с их именами.
10. Напишите функции для копирования структур пользователя и группы, включая указываемые данные. Для выделения памяти используйте при необходимости malloc()
.
11. Напишите специализированную библиотеку поиска пользователей, которая считывает в динамически выделяемый массив всю базу данных пользователей. Предусмотрите
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
-t
Сортирует вывод вместо имени по времени модификации, сначала более ранние.
-u
С опциями -t
и/или -l
использует время доступа вместо времени модификации. Наибольшие различия между V7 ls
и современной ls
затрагивают опцию -а
и опцию -l
. Современные системы опускают все файлы с точками, если не указана -а
, и они включают в длинный листинг -l
имена и владельца, и группы. На современных системах -g
означает вывод лишь имени группы, а -o
означает вывод лишь имени владельца. Стоит заметить, что у GNU ls
свыше 50 опций!
7.2. Код V7 ls
Файл /usr/src/cmd/ls.c
в дистрибутиве V7 содержит код. Весь он занимает 425 строк.
1 /*