Вход/Регистрация
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;

  • Читать дальше
  • 1
  • ...
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: