Арнольд Роббинс - Linux программирование в примерах Страница 37
- Категория: Компьютеры и Интернет / Программное обеспечение
- Автор: Арнольд Роббинс
- Год выпуска: -
- ISBN: -
- Издательство: -
- Страниц: 165
- Добавлено: 2019-06-19 14:34:53
Арнольд Роббинс - Linux программирование в примерах краткое содержание
Прочтите описание перед тем, как прочитать онлайн книгу «Арнольд Роббинс - Linux программирование в примерах» бесплатно полную версию:В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Арнольд Роббинс - Linux программирование в примерах читать онлайн бесплатно
#include <sys/types.h> /* POSIX */
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *file_name, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat *buf);
Функция stat() получает имя файла с путем и возвращает сведения о данном файле. Она следует по символическим ссылкам; т. е. при применении к символической ссылке stat() возвращает информацию об указываемом файле, а не о самой ссылке. В тех случаях, когда вам нужно знать, является ли файл символической ссылкой, используйте вместо нее функцию lstat(); последняя не следует по символическим ссылкам.
Функция fstat() получает сведения об уже открытом файле. Это особенно полезно для дескрипторов файлов 0, 1 и 2 (стандартных ввода, вывода и ошибки), которые уже открыты при запуске процесса. Однако, она может использоваться с любым открытым файлом. (Дескриптор открытого файла никогда не будет относиться к символической ссылке; убедитесь, что понимаете, почему.)
Значение, переданное в качестве второго параметра, должно быть адресом struct stat, объявленной в <sys/stat.h>. Как в случае с struct dirent, struct stat содержит по крайней мере следующие члены:
struct stat {
...
dev_t st_dev; /* устройство */
ino_t st_ino; /* индекс */
mode_t st_mode; /* тип и защита */
nlink_t st_nlink; /* число прямых (hard) ссылок */
uid_t st_uid; /* ID владельца */
gid_t st_gid; /* ID группы */
dev_t st_rdev; /* тип устройства (блочное или символьное) */
off_t st_size; /* общий размер в байтах */
blksize_t st_blksize; /* размер блока для ввода/вывода файл, с-мы */
blkcnt_t st_blocks; /* число выделенных блоков */
time_t st_atime; /* время последнего доступа */
time_t st_mtime; /* время последнего изменения */
time_t st_ctime; /* время последнего изменения индекса */
...
};
(Размещение на разных системах может быть разное.) Эта структура использует ряд определенных через typedef типов. Хотя они все (обычно) целые типы, использование специально определенных типов позволяет использовать для них различные размеры на разных системах. Это сохраняет переносимость кода пользователя, который их использует. Вот более полное описание каждого поля.
st_dev
Устройство для монтируемой файловой системы. У каждой монтируемой файловой системы уникальное значение st_dev.
st_ino
Номер индекса файла в пределах файловой системы. Пара (st_dev, st_ino) уникально идентифицирует файл.
st_mode
Тип файла и права доступа к нему, закодированные в одном поле. Вскоре мы рассмотрим, как извлечь эту информацию.
st_nlink
Число прямых ссылок на файл (счетчик ссылок). Может равняться нулю, если файл был удален после открытия.
st_uid
UID файла (номер владельца).
st_gid
GID файла (номер группы).
st_rdev
Тип устройства, если файл является блочным или символьным устройством. st_rdev содержит закодированную информацию об устройстве. Вскоре мы увидим, как извлечь эту информацию. Это поле не имеет смысла, если файл не является блочным или символьным устройством.
st_size
Логический размер файла. Как упоминалось в разделе 4.5 «Произвольный доступ: перемещение внутри файла», файл может содержать в себе дыры, в этом случае размер может не отражать истинного значения занимаемого им места.
st_blksize
«Размер блока» файла. Представляет предпочтительный размер блока данных для ввода/вывода данных в или из файла. Почти всегда превышает размер физического сектора диска. У более старых систем Unix нет этого поля (или поля st_blocks) в struct stat. Для файловых систем Linux ext2 и ext3 это значение составляет 4096.
st_blocks
Число «блоков», используемых файлом. В Linux это значение представлено в единицах 512-байтных блоков. На других системах размер блока может быть различным, проверьте свою локальную страницу справки для stat(2). (Это число происходит от константы DEV_BSIZE в <sys/param.h>. Эта константа не стандартизована, но довольно широко используется в системах Unix.)
Число блоков может быть больше, чем 'st_size / 512'; кроме блоков данных, файловая система может использовать дополнительные блоки для хранения размещений блоков данных. Это особенно необходимо для больших файлов.
st_atime
Время доступа к файлу; т.е. когда в последний раз читались данные файла.
st_mtime
Время модификации файла; т е. когда в последний раз данные файла записывались или урезались.
st_ctime
Время изменения индекса файла. Указывает время последнего изменения служебных данных файла, таких, как права доступа или владелец.
ЗАМЕЧАНИЕ. Поле st_ctime не является «временем создания»! В системе Linux или Unix нет такой вещи. Часть более ранней документации называла поле st_ctime временем создания. Это была вводящая в заблуждение попытка упростить представление служебных данных файла
Тип time_t, использованный для полей st_atime, st_mtime и st_ctime, представляет дату и время. Эти относящиеся ко времени значения иногда называют временными метками (timestamps). Обсуждение того, как использовать значение time_t, отложено до раздела 6.1 «Время и даты». Подобным же образом типы uid_t и gid_t представляют номера владельца и группы, которые обсуждаются в разделе 6.3 «Имена пользователя и группы». Большинство других типов не представляют широкого интереса.
5.4.3. Только Linux: указание файлового времени повышенной точности
Ядра Linux 2.6 и более поздние предоставляют в struct stat три дополнительных поля. Они предусматривают точность файлового времени до наносекунд:
st_atime_nsec Наносекундная компонента времени доступа к файлу.
st_mtime_nsec Наносекундная компонента времени изменения файла
st_ctime_nsec Наносекундная компонента времени изменения служебных данных файла.
Некоторые другие системы также предоставляют такие поля с повышенной точностью времени, но имена соответствующих членов структуры struct stat не стандартизованы, что затрудняет написание переносимого кода, использующего эти времена. (Связанные с этим расширенные системные вызовы см. в разделе 14.3.2 «Файловое время в микросекундах: utimes()».)
5.4.4. Определение типа файла
Вспомните, что в поле st_mode закодированы как тип файла, так и права доступа к нему. <sys/stat.h> определяет ряд макросов, которые определяют тип файла. В частности, эти макросы возвращают true или false при использовании с полем st_mode. У каждого описанного ранее типа файла есть свой макрос. Предположим, выполняется следующий код:
struct stat stbuf;
char filename[PATH_МАХ]; /* PATH_MAX из <limits.h> */
/* ... поместить имя файла в filename ... */
if (stat(filename, &stbuf) < 0) {
/* обработать ошибку */
}
Когда система заполнила stbuf, можно вызывать следующие макросы, причем в качестве аргумента передается stbuf.st_mode:
S_ISREG(stbuf.st_mode)
Возвращает true, если filename является обычным файлом.
S_ISDIR(stbuf.st_mode)
Возвращает true, если filename является каталогом.
S_ISCHR(stbuf.st_mode)
Возвращает true, если filename является символьным устройством. Устройства вскоре будут обсуждены более подробно.
S_ISBLK(stbuf.st_mode)
Возвращает true, если filename является блочным устройством.
S_ISFIFO(stbuf.st_mode)
Возвращает true, если filename является FIFO.
S_ISLNK(stbuf.st_mode)
Возвращает true, если filename является символической ссылкой. (Это может никогда не вернуть true, если вместо lstat() использовались stat() или fstat().)
S_ISSOCK(stbuf.st_mode)
Возвращает true, если filename является сокетом.
ЗАМЕЧАНИЕ. В GNU/Linux эти макросы возвращают 1 для true и 0 для false. Однако, на других системах возможно, что они будут возвращать для true вместо 1 произвольное неотрицательное число. (POSIX определяет лишь ненулевое значение в противоположность нулевому). Поэтому всегда следует использовать эти макросы как автономные тесты вместо проверки возвращаемого значения.
/* Корректное использование */
if (S_ISREG(stbuf.st_mode)) ...
/* Heкорректное использование */
Жалоба
Напишите нам, и мы в срочном порядке примем меры.