Linux программирование в примерах
Часть 56 из 253 Информация о книге
Тип
, использованный для полейtime_t,st_atimeиst_mtime, представляет дату и время. Эти относящиеся ко времени значения иногда называют временными метками (timestamps). Обсуждение того, как использовать значениеst_ctime, отложено до раздела 6.1 «Время и даты». Подобным же образом типыtime_tиuid_tпредставляют номера владельца и группы, которые обсуждаются в разделе 6.3 «Имена пользователя и группы». Большинство других типов не представляют широкого интереса.gid_t5.4.3. Только Linux: указание файлового времени повышенной точности
Ядра Linux 2.6 и более поздние предоставляют в
три дополнительных поля. Они предусматривают точность файлового времени до наносекунд:struct statНаносекундная компонента времени доступа к файлу.st_atime_nsecНаносекундная компонента времени изменения файлаst_mtime_nsecНаносекундная компонента времени изменения служебных данных файла.st_ctime_nsecНекоторые другие системы также предоставляют такие поля с повышенной точностью времени, но имена соответствующих членов структуры
не стандартизованы, что затрудняет написание переносимого кода, использующего эти времена. (Связанные с этим расширенные системные вызовы см. в разделе 14.3.2 «Файловое время в микросекундах:struct stat».)utimes()5.4.4. Определение типа файла
Вспомните, что в поле
закодированы как тип файла, так и права доступа к нему.st_modeопределяет ряд макросов, которые определяют тип файла. В частности, эти макросы возвращают<sys/stat.h>илиtrueпри использовании с полемfalse. У каждого описанного ранее типа файла есть свой макрос. Предположим, выполняется следующий код:st_modestruct stat stbuf;char filename[PATH_МАХ]; /* PATH_MAX из <limits.h> *//* ... поместить имя файла в filename ... */if (stat(filename, &stbuf) < 0) {/* обработать ошибку */}Когда система заполнила
, можно вызывать следующие макросы, причем в качестве аргумента передаетсяstbuf:stbuf.st_modeS_ISREG(stbuf.st_mode)Возвращает
, еслиtrueявляется обычным файлом.filenameS_ISDIR(stbuf.st_mode)Возвращает
, еслиtrueявляется каталогом.filenameS_ISCHR(stbuf.st_mode)Возвращает
, еслиtrueявляется символьным устройством. Устройства вскоре будут обсуждены более подробно.filenameS_ISBLK(stbuf.st_mode)Возвращает
, еслиtrueявляется блочным устройством.filenameS_ISFIFO(stbuf.st_mode)Возвращает
, еслиtrueявляется FIFO.filenameS_ISLNK(stbuf.st_mode)Возвращает
, еслиtrueявляется символической ссылкой. (Это может никогда не вернутьfilename, если вместоtrueиспользовалисьlstat()илиstat().)fstat()S_ISSOCK(stbuf.st_mode)Возвращает
, еслиtrueявляется сокетом.filenameЗАМЕЧАНИЕ. В GNU/Linux эти макросы возвращают 1 для
и 0 дляtrue. Однако, на других системах возможно, что они будут возвращать дляfalseвместо 1 произвольное неотрицательное число. (POSIX определяет лишь ненулевое значение в противоположность нулевому). Поэтому всегда следует использовать эти макросы как автономные тесты вместо проверки возвращаемого значения.true/* Корректное использование */if (S_ISREG(stbuf.st_mode)) .../* Heкорректное использование */if (S_ISREG(stbuf.st_mode) ==1) ...Наряду с макросами
предоставляет два набора битовых масок. Один набор для проверки прав доступа, а другой - для проверки типа файла. Мы видели маски прав доступа в разделе 4.6 «Создание файлов», когда обсуждали тип<sys/stat.h>и значения дляmode_tиopen(). Битовые маски, их числовые значения для GNU/Linux и смысл приведены в табл. 5.2.creat()Таблица 5.2. Битовые маски POSIX для типов файлов и прав доступа в
<sys/stat.h>
Маска Значение Комментарий S_IFMT0170000 Маска для битовых полей типа файла S_IFSOCK0140000 Сокет. S_IFLNK0120000 Символическая ссылка S_IFREG0100000 Обычный файл. S_IFBLK0060000 Блочное устройство. S_IFDIR0040000 Каталог. S_IFCHR0020000 Символьное устройство. S_IFIFO0010000 FIFO. S_ISUID0004000 Бит setuid. S_ISGID0002000 Бит setgid S_ISVTX0001000 «Липкий» (sticky) бит. S_IRWXU0000700 Маска для прав доступа владельца. S_IRUSR0000400 Доступ на чтение для владельца. S_IWUSR0000200 Доступ на запись для владельца. S_IXUSR0000100 Доступ на исполнение для владельца. S_IRWXG0000070 Маска для прав доступа группы. S_IRGRP0000040 Доступ на чтение для группы. S_IWGRP0000020 Доступ на запись для группы. S_IXGRP0000010 Доступ на исполнение для группы. S_IRWXO0000007 Маска для прав доступа остальных. S_IROTH0000004 Доступ на чтение для остальных. S_IWOTH0000002 Доступ на запись для остальных. S_IXOTH0000001 Доступ на исполнение для остальных.