Категории
Самые читаемые
PochitayKnigi » Компьютеры и Интернет » Интернет » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

Читать онлайн Linux программирование в примерах - Роббинс Арнольд

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 78 79 80 81 82 83 84 85 86 ... 253
Перейти на страницу:

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) {

147    if (argc>1)

148     printf("n%s:n", ep->ln.namep);

149    lastp = slastp;

150    readdir(ep->ln.namep);

151    if (fflg==0)

152     qsort(slastp, lastp - slastp, sizeof *lastp, compar);

153    if (lflg || sflg)

154     printf("total %Dn", tblocks);

155    for (ep1=slastp; ep1<lastp; ep1++)

156     pentry(*ep1);

157   } else

158   pentry(ep);

159  }

160  exit(0);

161 } /* Конец main() */

Строки 136–141 перебирают аргументы, собирая сведения о каждом. Второй аргумент gstat() булевый: true, если имя является аргументом командной строки, в противном случае false. Строка 140 добавляет флаг ISARG к полю lflags для каждого аргумента командной строки.

1 ... 78 79 80 81 82 83 84 85 86 ... 253
Перейти на страницу:
Тут вы можете бесплатно читать книгу Linux программирование в примерах - Роббинс Арнольд.
Комментарии