Шрифт:
Интервал:
Закладка:
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 для каждого аргумента командной строки.
- Самоучитель современного пользователя ПК - В. Мельниченко - Интернет
- Глобальное управление Интернетом и безопасность в сфере использования ИКТ: Ключевые вызовы для мирового сообщества - Олег Демидов - Интернет
- Профессиональный поиск в Интернете - Алексей Кутовенко - Интернет
- Wi-Fi: Все, что Вы хотели знать, но боялись спросить - Щербаков А. К. - Интернет
- Интернет-маркетинг на 100% - Коллектив авторов - Интернет
- Информация. Собственность. Интернет. Традиция и новеллы в современном праве - Михаил Якушев - Интернет
- Я знаю, что им ответить. Как правильно работать с негативными отзывами и комментариями в интернете - Тимур Анатольевич Асланов - Маркетинг, PR, реклама / Интернет / Самосовершенствование
- Как сделать карьеру с помощью Интернета - Валентин Соломенчук - Интернет
- Лидогенерация: клиентов много не бывает - Рустам Назипов - Интернет
- Как заработать на контекстной рекламе - Алексей Мультин - Интернет