На этом шаге мы рассмотрим структуру индексного дескриптора и функции, связанные с ним.
В файловой системе UNIX информация о файле хранится в его индексном дескрипторе (mode). Структура индексного дескриптора состоит из 13 полей, для которых используются специальные обозначения. Все они перечислены в таблице 1.
Поле | Описание |
---|---|
dev | Номер устройства в файловой системе. |
ino | Номер индексного дескриптора. |
mode | Режим файла (тип и права доступа). |
nlink | Количество жестких ссылок на файл (в отсутствии ссылок равно 1). |
uid | Числовой идентификатор владельца файла. |
gid | Числовой идентификатор группы владельца файла. |
rdev | Идентификатор устройства (только для специальных файлов). |
size | Размер файла в байтах. |
atime | Время последнего обращения к файлу с начала эпохи. |
mtime | Время последнего изменения файла с начала эпохи. |
ctime | Время изменения индексного дескриптора с начала эпохи. |
blksize | Предпочтительный размер блока для операций ввода/вывода. |
blocks | Фактическое количество выделенных блоков для размещения файла. |
Для получения значений полей структуры индексного дескриптора файла в Perl предназначена функция stat(). Ее единственным параметром может быть либо имя файла, либо дескриптор открытого в программе файла. Она возвращает список из 13 элементов, содержащих значения полей структуры индексного дескриптора файла в том порядке, как они перечислены в таблице 1. Типичное использование в программе Perl представлено ниже
($dev,$ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat($filename);
Присваивание значений полей списку скалярных переменных с идентификаторами, соответствующими названиям полей, способствует лучшей читаемости программы, чем присваивание массиву скаляров:
@inode = stat($filename);
В последнем случае получить значение соответствующего поля можно только с помощью индекса, что не совсем удобно, так как надо помнить номер нужного поля структуры.
Если при обращении к функции stat() не указан параметр, то она возвращает структуру индексного дескриптора файла, чье имя содержится в специальной переменной $_.
Функция получения информации о файле при успешном выполнении в списковом контексте возвращает список значений полей структуры индексного дескриптора файла или пустой список в случае неудачного завершения. В скалярном контексте она возвращает булево значение Истина или Ложь в зависимости от результатов своего выполнения.
Для удобства использования информации о файле функция stat() при успешном выполнении кэширует полученные значения полей. Если вызвать эту функцию со специальным дескриптором файла _ (символ подчеркивания), то она возвратит информацию, хранящуюся в кэше от предыдущего ее вызова. Это позволяет проверять различные атрибуты файла без повторного вызова функции stat() или сохранения результатов ее выполнения в переменных программы.
Функцию stat() можно использовать для получения структуры индексного дескриптора не только файла, но и жестких ссылок на него, а также каталогов, так как они являются также файлами, блоки данных которых содержат имена файлов каталога и их числовых индексных дескрипторов. Для получения информации о символических ссылках следует использовать функцию lstat(), которая возвращает список значений полей структуры индексного дескриптора самой ссылки, а не файла, на который она ссылается. Эта функция работает аналогично функции stat(), включая использование специального дескриптора _.
На следующем шаге мы рассмотрим унарные операции.