Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Строки 178–197 обрабатывают опцию
-lt-gСтроки 189–192 проверяют, является ли файл блочным или символьным устройством. Если да, они выводят старшее и младшее номера устройств, извлеченные с помощью макросов
major()minor()Строки 193–196 выводят соответствующее время. Если оно старше шести месяцев, код выводит месяц, день и год. В противном случае, выводятся месяц, день и время (формат результата с
time()asctime()ctime()Наконец, строки 198–201 выводят имя файла. Мы знаем, что для аргумента командной строки это завершающаяся нулем строка, и может быть использована
%s%.14s204 getname(uid, buf) /* int getname(int uid, char buf[]) */205 int uid;206 char buf[];207 {208 int j, c, n, i;209210 if (uid==lastuid) /* Простое кэширование, см. текст */211 return(0);212 if (pwdf == NULL) /* Проверка безопасности */213 return(-1);214 rewind(pwdf); /* Начать с начала файла */215 lastuid = -1;216 do {217 i = 0; /* Индекс в массиве buf */218 j = 0; /* Число полей в строке */219 n = 0; /* Преобразование числового значения */220 while ((c=fgetc(pwdf)) != 'n') { /* Прочесть строки */221 if (c==EOF)222 return(-1);223 if (c==':') { /* Число полей*/224 j++;225 c = '0';226 }227 if (j==0) /* первое поле - имя */228 buf[i++] = c;229 if (j==2) /* Третье поле - числовой ID */230 n = n*10 + c - '0';231 }232 } while (n != uid); /* Продолжать до обнаружения ID */233 buf[i++] = ' ';234 lastuid = aid;235 return(0);236 }Функция
getname()uidlastuidlastuidgetname()pwdf/etc/passwd/etc/groupУдивительно,
lsgetpwuid()getgrgid()/etc/passwd/etc/groupСтроки 216–232 реализуют линейный поиск по файлу.
jСтроки 233–235 завершают буфер
namelastuid238 long /* long nblock(long size) */239 nblock(size)240 long size;241 {242 return ((size+511) >>9);243 }Функция
nblock()stat()Вычисление в строке 242 выглядит несколько устрашающим. '
>>91 / 512size+511Это вычисление, однако, лишь приблизительное. У очень больших файлов есть также дополнительные блоки. Несмотря на заявление в справочной странице V7 ls(1), данное вычисление не принимает в расчет дополнительные блоки.
Более того, рассмотрите случай файла с большими дырами (созданными установкой указателя файла дальше конца файла с помощью
lseek()nblock()По этим причинам в
struct statst_blocks