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

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

Жанры

Linux программирование в примерах
Шрифт:

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");

131 }

132 if (argc==0) { /* Если нет аргументов, использовать текущий */

133 argc++;

134 argv = &dotp - 1;

135 }

Строки 119–125 обрабатывают опцию

– f
, выключая
– l
,
– s
,
– t
и
statreq
. Строки 126–131 обрабатывают
– l
, устанавливая для файла чтение сведений о владельце или группе. Помните, что V7 показывает лишь одно из этих сведений, но не оба.

Если аргументов больше не осталось, строки 132–135 устанавливают

argv
таким образом, что он указывает на строку, представляющую текущий каталог. Назначение '
argr = &dotp - 1
' действительно, хотя и необычно. '
– 1
' компенсирует '
++argv
' в строке 137. Это позволяет избежать в главной части программы специального случая для '
argc == 1
'.

136 for (i=0; i < argc; i++) { /* Получить сведения о каждом файле */

137 if ((ер = gstat(*++argv, 1))==NULL)

138 continue;

139 ep->ln.namep = *argv;

140 ep->lflags |= ISARG;

141 }

142 qsort(firstp, lastp - firstp, sizeof *lastp, compar);

143 slastp = lastp;

144 for (epp=firstp; epp<slastp; epp++) { /* Глав. код, см. текст */

145 ер = *epp;

146 if (ep->ltype=='d' && dflg==0 || fflg) {

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

Эволюционер из трущоб. Том 12

Панарин Антон
12. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 12

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

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

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

Герой

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

Древесный маг Орловского княжества 2

Павлов Игорь Васильевич
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 2

Тринадцатый X

NikL
10. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Тринадцатый X

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Династия. Феникс

Майерс Александр
5. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Династия. Феникс

Личный аптекарь императора. Том 4

Карелин Сергей Витальевич
4. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 4

Великий князь

Кулаков Алексей Иванович
2. Рюрикова кровь
Фантастика:
альтернативная история
8.47
рейтинг книги
Великий князь

Неучтенный элемент. Том 9

NikL
9. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 9