Теперь мы обсудим системные вызовы применительно к файловой системе, в частности к такой информации о файлах, как размеры, даты изменений, права доступа и т.д. Эти системные вызовы позволяют получить полностью всю информацию, о которой упоминалось во второй главе.
Для начала разберемся в самом индексном дескрипторе. Часть индексного дескриптора описывается структурой stat, определенной в
:
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
определены в
, как отмечено выше. Поле st_mode
содержит множество флагов, описывающих файл; для удобства определения флагов также являются частью файла
:
#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
#include
#include
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)
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии