Заметьте, что при том, что разбит на короткие секции, перемежаемые текстовыми пояснениями, архив с полным исходным текстом в виде единого файла можно взять на веб-сайте компании PARSE Software Devices (http://www.parse.com/
atoz.c.
Первый приведенный раздел программы представляет собой функцию
Массив
а
» до «z
». Атрибутная запись, применяемая непосредственно для каталога (то есть для /dev/atoz
, объявлена в теле функции Файловая атрибутная запись:
Маркируется как обычный файл (константа S_IFREG) с режимом доступа 0444 (это означает, что доступ по чтению имеет каждый, но доступа по записи нет ни у кого). Размер равен «1» — файл содержит только один байт, а именно прописную букву, соответствующую своему имени. Индексные дескрипторы (inodes) этих файлов пронумерованы от «1» до «26» включительно (было бы удобнее взять числа от «0» до «25», но цифра «0» зарезервирована).
Каталоговая атрибутная запись:
Маркируется как файл типа «каталог» (константа S_IFDIR) с режимом доступа 0555 (это означает, что доступ по чтению и поиску имеет каждый, но доступа по записи нет ни у кого). Размер определен как «26» — это просто число, взятое по количеству элементов в каталоге. Индексный дескриптор выбран равным «27» — это число заведомо не используется больше ни в одной атрибутной записи.
Обратите внимание, что мы переопределили только поле
Наконец, обратите внимание, как мы создали имя /dev/atoz
/*
* atoz.с
*
* /dev/atoz с использованием библиотеки администратора ресурсов
*/
#include
#include
#include
#include
#include
#include
#include
#include
#define ALIGN(x) (((x) +3) & ~3)
#define NUM_ENTS 26
static iofunc_attr_t atoz_attrs[NUM_ENTS];
int main (int argc, char **argv) {
dispatch_t *dpp;
resmgr_attr_t resmgr_attr;
resmgr_context_t *ctp;
resmgr_connect_funcs_t connect_func;
resmgr_io_funcs_t io_func;
iofunc_attr_t attr;
int i;
// Создать структуру диспетчеризации
if ((dpp = dispatch_create()) == NULL) {
perror("Ошибка dispatch_create\n");
exit(EXIT_FAILURE);
}
// Инициализировать структуры данных
memset(&resmgr_attr, 0, sizeof(resmgr_attr));
resmgr_attr.nparts_max = 1;
resmgr_attr.msg_max_size = 2048;
// Назначить обработчики по умолчанию
iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_func,
_RESMGR_IO_NFUNCS, &io_func);
// Создать и инициализировать атрибутную запись для
// каталога...
iofunc_attr_init(&attr, S_IFDIR | 0555, 0, 0);
attr.inode = NUM_ENTS + 1; // 1-26 зарезервированы для
// файлов от «a» до «z»
attr.nbytes = NUM_ENTS; // 26 элементов в каталоге
// ...и для имен от «a» до «z»
for (i = 0; i < NUM_ENTS; i++) {
iofunc_attr_init(&atoz_attrs[i], S_IFREG | 0444, 0, 0);
atoz_attrs[i].inode = i + 1;
atoz_attrs[i].nbytes = 1;
}
// Добавить наши функции; нам интересны только io_open
// и io_read
connect_func.open = my_open;
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT