Чтение онлайн

на главную - закладки

Жанры

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
рейтинг книги
Последний Паладин. Том 2

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник