Linux программирование в примерах
Шрифт:
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 опций! 7.2. Код V7
ls
Файл
/usr/src/cmd/ls.c
в дистрибутиве V7 содержит код. Весь он занимает 425 строк. 1 /*
2 * перечисляет файлы или каталоги
3 */
4
5 #include <sys/param.h>
6 #include <sys/stat.h>
7 #include <sys/dir.h>
8 #include <stdio.h>
9
10 #define NFILES 1024
11 FILE *pwdf, *dirf;
12 char stdbuf[BUFSIZ];
13
14 struct lbuf { /* Собирает необходимые сведения */
15 union {
16 char lname[15];
17 char *namep;
18 } ln;
19 char ltype;
20 short lnum;
21 short lflags;
22 short lnl;
23 short luid;
24 short lgid;
25 long lsize;
26 long lmtime;
27 };
28
29 int aflg, dflg, lflg, sflg, tflg, uflg, lflg, fflg, gflg, cflg;
30 int rflg = 1;
31 long year; /* Глобальные переменные: инициализируются 0 */
32 int flags;
33 int lastuid = -1;
34 char tbuf[16];
35 long tblocks;
36 int statreq;
37 struct lbuf *flist[NFILES];
38 struct lbuf **lastp = flist;
39 struct lbuf **firstp = flist;
40 char *dotp = ".";
41
42 char *makename; /* char *makename(char *dir, char *file); */
43 struct lbuf *gstat; /* struct lbuf *gstat(char *file, int argfl); */
44 char *ctime; /* char *ctime(time_t *t); */
Поделиться:
Популярные книги
Последний Паладин. Том 2
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зубных дел мастер
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Истребитель. Ас из будущего
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Честное пионерское! Часть 3
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Обгоняя время
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Страж. Тетралогия
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Магия чистых душ
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Имя нам Легион. Том 4
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Девятый
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Морской волк. 1-я Трилогия
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Отмороженный 8.0
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Совершенный: охота
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Калибр Личности 1
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Личник
3. Ермак
Фантастика:
альтернативная история
6.33