Индексный узел: информация, хранимая вместе с файлом
Кроме самих данных, файловая система UNIX предусматривает хранение информации о каждом файле в энергонезависимой памяти. Эта информация хранится в структуре, называемой индексным узлом файла. Индексный узел содержит много полей, в том числе поля с обозначением идентификаторов владельца и группы, целого числа с обозначением режима файла (см. раздел 24.7.4), времени последнего доступа, времени последнего изменения, размера файла, дисковода и файловой системы, в которой находится файл, числа записей каталога для этого файла, числа дисковых блоков, используемых в настоящее время этим файлом, и основного типа (который определяет, например, является ли он обычным файлом или каталогом).
Понятие индексного узла позволяет описать некоторые особенности файловой системы UNIX, которые применяются также в системе NFS. Во-первых, в системе UNIX такая информация, как данные о владельце и битах защиты файла, отделена от записей каталога для рассматриваемого файла. Это позволяет иметь несколько записей каталога, которые указывают на один и тот же файл. В системе UNIX для обозначения записи каталога, относящейся к файлу, используется термин ссылка или жесткая ссылка. Как показано на рис. 24.5, если имеется более одной жесткой ссылки на файл, то информация о нем присутствует в нескольких каталогах. На этом рисунке показаны две ссылки на файл h; одна из них находится в каталоге а, а вторая — в каталоге d. К файлу h можно обратиться по составному имени /а/h или /b/d/h.

К файлам, на которые указывают несколько жестких ссылок, можно обратиться по нескольким полным составным именам. Например, к файлу h, как показанному на рис. 24.5, можно обратиться по полному составному имени /а/h, поскольку ссылка на него находится в каталоге а. К нему можно также обратиться по полному составному имени /b/d/h, поскольку ссылка на него находится и в каталоге d. Как показывает этот пример, составные имена файла с несколькими ссылками могут иметь различную длину.
Поскольку информация о файле хранится в индексном узле, а не в каталоге, то информация о владельце и правах защиты файла h остается неизменной, независимо от того, какое имя используется в приложении для доступа к файлу. Если владелец изменит режим защиты файла /а/h, изменится также режим защиты файла /b/d/h.
Назначение функции stat
Системная функция stat извлекает информацию о файле из его индексного узла и возвращает эту информацию в вызывающий оператор. Вызов этой функции принимает два параметра: составное имя файла и адрес структуры, в которую должен быть помещен этот результат:
stat(pathname,&result_struct);
Второй параметр должен представлять собой адрес области в памяти, достаточно большой для размещения следующей структуры:
struct stat { /* Структура, возвращаемая функцией stat */
dev_t st_dev; /* Устройство, на котором находится индексный узел */ ino_t st_ino; /* Номер индексного узла файла */ u_short stjnode; /* Биты защиты */
short st_nlink; /* Общее число жестких ссылок на файл */
short st_uid; /* Идентификатор пользователя-владельца файла */
short st_gid; /* Идентификатор группы, присвоенный файлу */
dev_t stjrdev; /* Используется для устройств, а не файлов */
long st_size; /* Общий размер файла в байтах */
time_t st_atime; /* Время последнего доступа к файлу */
int stjmusedl; /* Не используется */
time_t stjntime; /* Время последнего изменения */
int st_unused2; /* Не используется */
time_t st_ctime; /* Время последнего изменения индексного узла */
}?
Функцию stat для получения информации о файле может вызвать любой пользователь, даже не имеющий права на чтение этого файла. Однако вызывающий оператор должен иметь права доступа на поиск во всех каталогах вдоль пути к указанному файлу, так как в противном случае функция stat возвратит сообщение об ошибке.