switch (spname(argv[i], buf)) { case -1: /* no match possible */ fp = efopen(argv[i], "r"); break; case 1: /* corrected */ fprintf(stderr, "\"%s\"? ", buf); if (ttyin() == 'n') break; argv[i] = buf; /* fall through... */ case 0: /* exact match */ fp = efopen(argv[i], "r"); print(fp, pagesize); fclose(fp); } exit(0);}Функции по коррекции написания не следует слепо применять к каждой программе, которая использует имена файлов. Они хорошо сочетаются с
ppНасколько вы можете улучшить эвристику для выявления наилучшего совпадения в
spnameИмя
txtcсРаботает ли
pМодифицируйте
spnameКакую пользу могли бы извлечь другие программы из
spname$ fix prog filenames...Можете написать версию
cdspname7.3 Файловая система: индексные дескрипторы
Теперь мы обсудим системные вызовы применительно к файловой системе, в частности к такой информации о файлах, как размеры, даты изменений, права доступа и т.д. Эти системные вызовы позволяют получить полностью всю информацию, о которой упоминалось во второй главе.
Для начала разберемся в самом индексном дескрипторе. Часть индексного дескриптора описывается структурой stat, определенной в
<sys/stat.h>struct stat /* структура, возвращаемая stat */{ dev_t st_dev; /* устройство, содержащее файл */ ino_t st_ino; /* индекс */ short st_mod; /* биты режима */ short st_nlink; /* число связей файла */ short st_uid; /* пользовательский идентификатор владельца */ short st_gid; /* идентификатор группы владельцев */ dev_t st_rdev; /* для специальных файлов */ off_t st_size; /* размер файла в символах */ time_t st_atime; /* время последнего чтения файла */ time_t st_mtime; /* время последней записи или создания файла */ time_t st_ctime; /* время последнего изменения индексного дескриптора или файла */}Большинство полей поясняются примечаниями. Типы вроде
dev_tino_t<sys/types.h>st_mode<sys/stat.h>#define S_IFMT 0170000 /* тип файла */#define S_IFDIR 0040000 /* каталог */#define S_IFCHR 0020000 /* байт-ориентированный */#define S_IFBLK 0060000 /* блок-ориентированный */#define S_IFREG 0100000 /* регулярный */#define S_SUID 0004000 /* установка идентификатора пользователя при выполнении */#define S_ISGID 0002000 /* установка идентификатора группы при выполнении */#define S_ISVTX 0001000 /* сохранить выгруженный текст даже после использования */#define S_IREAD 0000400 /* разрешение читать, владелец */#define S_IWRITE 0000200 /* разрешение писать, владелец */#define S_IEXEC 0000100 /* разрешение на выполнение/поиск, владелец */Индексный дескриптор для файла доступен двум системным вызовам
statfstatstatFstatFILEchar *name;int fd;