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); */
Поделиться:
Популярные книги
Император Пограничья 10
10. Император Пограничья
Фантастика:
городское фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Матабар V
5. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Я снова князь. Книга XXIII
23. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Император Пограничья 4
4. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Афганский рубеж 4
4. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Страж Кодекса. Книга VII
7. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда VII
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Вечный. Книга II
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Страж Кодекса
1. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 12
12. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Я уже царь. Книга XXIX
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Клан
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Господин из завтра. Тетралогия.
Фантастика:
альтернативная история
8.32