Книга: Программирование для Linux. Профессиональный подход
Б.2. Функция stat()
Б.2. Функция stat()
Функция read()
позволяет прочесть только содержимое файла. Но как насчет остальной информации? Например, команда ls -l
сообщает такие сведения о файлах в текущем каталоге, как размер, время последнего обновления, права доступа, владелец и пр. Аналогичную информацию об отдельном файле можно получить с помощью функции stat()
. Ей необходимо передать путевое имя файла и указатель на структуру типа stat
. В случае успешного завершения функция возвращает 0 и заполняет поля структуры данными о файле, иначе возвращается -1.
Перечислим наиболее полезные поля структуры stat
.
? В поле st_mode
содержится код доступа к файлу. О правах доступа к файлам рассказывалось в разделе 10.3. "Права доступа к файлам". В старшем бите поля закодирован тип файла. Об этом пойдет речь ниже.
? В полях st_uid
и st_gid
содержатся идентификаторы соответственно пользователя и группы, которым принадлежит файл. Назначение идентификатора описывалось в разделе 10.1, "Пользователи и группы".
? В поле st_size
хранится размер файла в байтах.
? В поле st_atime
записано время последнего обращения к файлу (для чтения или записи).
? В поле st_mtime
записано время последней модификации файла.
Следующие макросы проверяют поле st_mode
, чтобы определить, для файла какого типа была вызвана функция stat
. Макросы возвращают ненулевое значение, если их догадка о типе файла подтвердилась.
? S_ISBLK(код доступа)
— блочное устройство:
? S_ISCHR(код доступа)
— символьное устройство;
? S_ISDIR(код доступа)
— каталог;
? S_ISFIFO(код доступа)
— FIFO-файл (именованный канал):
? S_ISLNK(код доступа)
— символическая ссылка.
? S_ISREG(код доступа)
— обычный файл;
? S_ISSOCK(код доступа)
— сокет.
В поле st_dev
содержатся старший и младший номера аппаратного устройства, в котором расположен файл (о номерах устройств рассказывалось в главе 6, "Устройства"). Старший номер находится в старшем байте поля, а младший — в младшем. В поле st_infо
содержится номер индексного дескриптора файла, определяющий местоположение файла в файловой системе.
Если вызвать функцию stat()
для символической ссылки, функция проследит, куда указывает ссылка, и вернет информацию о том файле, а не о самой ссылке. Таким образом, в случае функции stat()
макрос S_ISLNK()
всегда будет возвращать значение 0. Есть другая функция, lstat()
, которая не пытается отслеживать символические ссылки. Во всем остальном она эквивалентна функции stat()
. Если вызвать функцию stat()
для поврежденной ссылки (которая указывает на несуществующий или недоступный файл), возникнет ошибка, тогда как функция lstat()
в подобной ситуации выполнится успешно.
Если файл уже открыт для чтения или записи, лучше пользоваться функцией fstat()
. В качестве первого аргумента она принимает не путевое имя, а дескриптор.
В листинге Б.6 показана функция которая создает буфер достаточного размера и загружает в него содержимое указанного файла. Размер файла определяется с помощью функции fstat()
. Она же позволяет проверить, соответствует ли заданное имя обычному файлу.
- Пример: функция readline, использующая собственные данные потока
- 8.4.3.2. Функция обратного вызова nftw()
- Пример:команднаяоболочкауправленияслужбами
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- Chapter 7. The state machine
- User-land states
- State match
- Функция strcmp( )
- State NEW packets but no SYN bit set
- Конкурентный бенчмаркинг в GE Real Estate