С помощью
lseekget(fd, pos, buf, n) /* read n bytes from position pos */ int fd, n; long pos; char *buf;{ if (lseek(fd, pos, 0) == -1) /* get to pos */ return -1; return read(fd, buf, n);}Модифицируйте
readslow-е$ readslow -езаставляет
readslowlseekПерепишите
efopen7.2 Файловая система: каталоги
Наша следующая тема — как ориентироваться в иерархии каталогов. При этом мы будем использовать не новые системные вызовы, а лишь несколько старых в новом контексте. В качестве примера приведем функцию
spnamen = spname(name, newname);ищет файл с именем, "достаточно близким" к name. Если такое имя найдено, оно копируется в
newnamespnameSpnamep$ p /urs/srx/ccmd/p/spnam.с "/usr/src/cmd/p/spname.с"? y /* spname: возвращает верно написанное имя файла */...Пока мы пишем имя файла,
spnameПрежде чем писать программу, уместно сделать короткий обзор структуры файловой системы. Каталог представляет собой файл, содержащий список имен файлов и указание, где они размещены. Место размещения определяется индексом в так называемой индексной таблице файлов. В записи индексной таблицы содержится вся информация о файле, кроме его имени. Строка каталога, таким образом, состоит из двух элементов — индекса файла и его имени. Точное описание можно найти в файле
<sys/dir.h>$ cat /usr/include/sys/dir.h#define DIRSIZ 14 /* максимальная длина имени файла */struct direct /* структура строки каталога */{ ino_t d_ino; /* номер индексного дескриптора */ char d_name[DIRSIZ]; /* имя файла */};$"Тип"
ino_ttypedefunsigned shorttypedef<sys/types.h><sys/dir.h>Действия
spname/d1/d2/f/d1d2Мы разбили процесс на три функции. Сама
spnamemindistspnamespdist/* spname: return correctly spelled filename *//* * spname(oldname, newname) char *oldname, *newname; * returns -1 if no reasonable match to oldname, * 0 if exact match, *1 if corrected. * stores corrected name in newname. */#include <sys/types.h>#include <sys/dir.h>spname(oldname, newname) char *oldname, *newname;{ char *p, guess[DIRSIZ+1], best[DIRSIZ+1]; char *new = newname, *old = oldname; for (;;) { while (*old == '/') /* skip slashes */ *new++ = *old++; *new = '\0'; if (*old == '\0') /* exact or corrected */ return strcmp(oldname, newname) != 0;