Чтение онлайн

на главную - закладки

Жанры

UNIX — универсальная среда программирования
Шрифт:

7.3 Файловая система: индексные дескрипторы

Теперь мы обсудим системные вызовы применительно к файловой системе, в частности к такой информации о файлах, как размеры, даты изменений, права доступа и т.д. Эти системные вызовы позволяют получить полностью всю информацию, о которой упоминалось во второй главе.

Для начала разберемся в самом индексном дескрипторе. Часть индексного дескриптора описывается структурой stat, определенной в

<sys/stat.h>
:

struct stat /* структура, возвращаемая stat */

{

 dev_t st_dev; /* устройство, содержащее файл */

 ino_t st_ino; /* индекс */

 short st_mod; /* биты режима */

 short st_nlink; /* число связей файла */

 short st_uid; /* пользовательский идентификатор

владельца */

 short st_gid; /* идентификатор группы владельцев */

 dev_t st_rdev; /* для специальных файлов */

 off_t st_size; /* размер файла в символах */

 time_t st_atime; /* время последнего чтения файла */

 time_t st_mtime; /* время последней записи

или создания файла */

 time_t st_ctime; /* время последнего изменения

индексного дескриптора или файла */

}

Большинство полей поясняются примечаниями. Типы вроде

dev_t
и
ino_t
определены в
<sys/types.h>
, как отмечено выше. Поле
st_mode
содержит множество флагов, описывающих файл; для удобства определения флагов также являются частью файла
<sys/stat.h>
:

#define S_IFMT 0170000 /* тип файла */

#define S_IFDIR 0040000 /* каталог */

#define S_IFCHR 0020000 /* байт-ориентированный */

#define S_IFBLK 0060000 /* блок-ориентированный */

#define S_IFREG 0100000 /* регулярный */

#define S_SUID 0004000 /* установка идентификатора пользователя при

выполнении */

#define S_ISGID 0002000 /* установка идентификатора группы

при выполнении */

#define S_ISVTX 0001000 /* сохранить выгруженный текст даже после

использования */

#define S_IREAD 0000400 /* разрешение читать, владелец */

#define S_IWRITE 0000200 /* разрешение писать, владелец */

#define S_IEXEC 0000100 /* разрешение на выполнение/поиск, владелец */

Индексный дескриптор для файла доступен двум системным вызовам

stat
и
fstat
. При вызове
stat
параметром является имя файла, а результатом — информация из индексного дескриптора для этого файла (или — 1 при наличии ошибки).
Fstat
выполняет те же функции в отношении дескриптора открытого файла (не в отношении указателя на
FILE
). Иными словами,

char *name;

int fd;

struct stat stbuf;

stat(name, &stbuf);

fstat(fd, &stbuf);

заполняет структуру

stbuf
информацией из индексного дескриптора для имени файла или дескриптора файла
fd
.

Зная все это, мы можем приступить к написанию некоторой полезной программы. Начнем с версии

checkmail
— программы на Си, которая следит за содержимым вашего почтового ящика. Если файл увеличивается,
checkmail
выдает сообщение: "У вас есть корреспонденция" и включает звонок. (При уменьшении файла, видимо, из-за того, что вы успели прочитать и сбросить некоторую почтовую корреспонденцию, сообщение не требуется.) Для первого шага вы сделали вполне достаточно, а когда ваша программа заработает, вы станете знатоком.

/* checkmail: watch user's mailbox */

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

char *progname;

char *maildir = "/usr/spool/mail"; /* system dependent */

main(argc, argv)

 int argc;

 char *argv[];

{

 struct stat buf;

 char *name, *getlogin;

 int lastsize = 0;

 progname = argv[0];

 if ((name = getlogin) == NULL)

error("can't get login name", (char*)0);

 if (chdir(maildir) == -1)

error("can't cd to %s", maildir);

 for (;;) {

if (stat(name, &buf) == -1) /* no mailbox */

buf.st_size = 0;

if (buf.st_size > lastsize)

fprintf(stderr, "\nYou have mail\007\n");

lastsize = buf.st_size;

sleep(60);

 }

}

Функция

getlogin(3)
возвращает ваше регистрационное имя или
NULL
, если это невозможно,
checkmail
переходит к почтовому каталогу с помощью системного вызова
chdir
, так что последующие вызовы
stat
не должны будут "добираться" до почтового каталога через все каталоги, начиная от корневого. Возможно, вы должны адаптировать
maildir
для своей системы. Мы написали
checkmail
так, чтобы она работала, даже если нет почтового ящика, поскольку большинство версий mail убирают почтовый ящик в том случае, когда он пуст.

Поделиться:
Популярные книги

Третий Генерал: Том III

Зот Бакалавр
2. Третий Генерал
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Третий Генерал: Том III

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Цикл романов "Целитель". Компиляция. Книги 1-17

Большаков Валерий Петрович
Целитель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цикл романов Целитель. Компиляция. Книги 1-17

Введение в социальную философию

Момджян Карен Хачикович
Научно-образовательная:
философия
5.00
рейтинг книги
Введение в социальную философию

Инженер Петра Великого

Гросов Виктор
1. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Паутина зла

Прозоров Александр Дмитриевич
2. Ведун
Фантастика:
фэнтези
альтернативная история
8.16
рейтинг книги
Паутина зла

Кодекс Охотника. Книга XXXVII

Винокуров Юрий
37. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVII

Эволюционер из трущоб. Том 13

Панарин Антон
13. Эволюционер из трущоб
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 13

Адаптация

Кораблев Родион
1. Другая сторона
Фантастика:
фэнтези
6.33
рейтинг книги
Адаптация

Бой тигров в долине. Том 2

Маринина Александра
Детективы:
полицейские детективы
9.08
рейтинг книги
Бой тигров в долине. Том 2

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.25
рейтинг книги
Газлайтер. Том 23

Скоморошины

Сборник
Проза:
русская классическая проза
6.60
рейтинг книги
Скоморошины

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска