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

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

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

45 long nblock; /* long nblock(long size); */

46

47 #define ISARG 0100000

Программа начинается с включения файлов (строки 5–8) и объявлений переменных.

struct lbuf
(строки 14–27) инкапсулирует части
struct stat
, которые интересны
ls
. Позже мы увидим, как эта структура заполняется.

Переменные

aflg
,
dflg
и т.д. (строки 29 и 30) все указывают на наличие соответствующей опции. Такой стиль именования переменных типичен для кода V7.
Переменные
flist
,
lastp
и
firstp
(строки 37–39) представляют файлы, о которых
ls
выводит сведения. Обратите внимание, что flist является массивом фиксированного размера, которая позволяет обрабатывать не более 1024 файлов. Вскоре мы увидим, как используются все эти переменные.

После объявлений переменных идут объявления функций (строки 42–45), а затем определение

ISARG
, которая различает файл, указанный в командной строке, от файла, найденного при чтении каталога.

49 main(argc, argv) /* int main(int argc, char **argv) */

50 char *argv[];

51 {

52 int i;

53 register struct lbuf *ep, **ep1; /* Объявления переменных и функций */

54 register struct lbuf **slastp;

55 struct lbuf **epp;

56 struct lbuf lb;

57 char *t;

58 int compar;

59

60 setbuf(stdout, stdbuf);

61 time(&lb.lmtime); /* Получить текущее время */

62 year = lb.lmtime - 6L*30L*24L*60L*60L; /* 6 месяцев назад */

Функция

main
начинается с объявления переменных и функций (строки 52–58), устанавливая буфер для стандартного вывода, получая время дня (строки 60–61) и вычисляя значение секунд с начала Эпохи для примерно шести месяцев (строка 62). Обратите внимание, что у всех констант есть суффикс
L
, указывающий на использование арифметики
long
.

63 if (--argc > 0 && *argv[1] == '-') {

64 argv++;

65 while (*++*argv) switch(**argv) { /* Разбор опций */

66

67 case 'a': /* Все элементы каталога */

68 aflg++;

69 continue;

70

71 case 's': /* Размер в блоках */

72 sflg++;

73 statreq++;

74 continue;

75

76 case 'd': /* Сведения о каталоге, не содержание */

77 dflg++;

78 continue;

79

80 case 'g': /* Имя группы вместо имени владельца */

81 gflg++;

82 continue;

83

84 case 'l': /* Расширенный листинг */

85 lflg++;

86 statreq++;

87 continue;

88

89 case 'r': /*
Обратный порядок сортировки */

90 rflg = -1;

91 continue;

92

93 case 't': /* Сортировка по времени, не по имени */

94 tflg++;

95 statreq++;

96 continue;

97

98 case 'u': /* Время доступа, а не изменения */

99 uflg++;

100 continue;

101

102 case 'c': /* Время изменения индекса, а не файла */

103 cflg++;

104 continue;

105

106 case 'i': /* Включить номер индекса */

107 iflg++;

108 continue;

109

110 case 'f': /* Форсировать чтение каждого arg как каталога */

111 fflg++;

112 continue;

113

114 default: /* Незнакомые буквы опций игнорировать */

115 continue;

116 }

117 argc--;

118 }

Строки 63–118 разбирают опции командной строки. Обратите внимание на ручной разбор кода:

getopt
еще не была придумана. Переменная
statreq
устанавливается в
true
, когда опция требует использования системного вызова
stat
.

Избежание ненужного вызова

stat
для каждого файла дает большой выигрыш в производительности. Вызов
stat
был чрезвычайно дорогим, поскольку он мог вызвать поиск расположения индекса на файле, дисковое чтение для получения индекса, а затем поиск на диске расположения содержимого каталога (для того, чтобы продолжить чтение элементов каталога).

В современных системах индексы находятся в группах, распределенных по всей файловой системе, вместо объединения их вместе в начале. Это дает заметный прирост производительности. Тем не менее, вызовы

stat
до сих пор не бесплатны, вы должны использовать их лишь при необходимости, но не более.

119 if (fflg) { /* -f аннулирует -l, -s, -t, добавляя -a */

120 aflg++;

121 lflg = 0;

122 sflg = 0;

123 tflg = 0;

124 statreq = 0;

125 }

126 if (lflg) { /* Открыть файл паролей или групп */

127 t = "/etc/passwd";

128 if (gflg)

129 t = "/etc/group";

130 pwdf = fopen(t, "r");

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

Реванш

СветочкаN
Фантастика:
фэнтези
5.00
рейтинг книги
Реванш

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Князь

Мазин Александр Владимирович
3. Варяг
Фантастика:
альтернативная история
9.15
рейтинг книги
Князь

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Снега

Чепурин Юлий Петрович
Поэзия:
драматургия
5.00
рейтинг книги
Снега

На границе империй. Том 10. Часть 10

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 10

Боярышня Дуняша 2

Меллер Юлия Викторовна
2. Боярышня
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Боярышня Дуняша 2

Ваше Сиятельство 6

Моури Эрли
6. Ваше Сиятельство
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 6

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 23

Хроники Тириса. Книга 1

Маханенко Василий Михайлович
1. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
6.00
рейтинг книги
Хроники Тириса. Книга 1

Родословная. Том 4

Ткачев Андрей Юрьевич
4. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 4

Глубокий космос

Вайс Александр
9. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Глубокий космос

Группа крови на рукаве

Вязовский Алексей
1. ГК
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.40
рейтинг книги
Группа крови на рукаве

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая