5.3.2. Примеры программ
5.3.2. Примеры программ
В этом разделе рассматриваются две программы, в которых иллюстрируются чтение и запись файлов, отображаемых в памяти. Первая программа (листинг 5.5) генерирует случайное число и записывает его в отображаемый файл. Вторая программа (листинг 5.6) читает число из файла, выводит его на экран, а затем умножает на 2 и записывает обратно в файл. Обе программы принимают имя файла из командной строки.
Листинг 5.5. (mmap-write.c) Запись случайного числа в файл, отображаемый в памяти
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#define FILE_LENGTH 0x100
/* получение случайного числа в диапазоне [low,high]. */
int random_range(unsigned const low, unsigned const high) {
unsigned const range = high - low + 1;
return
low + (int)(((double)range) * rand() / (RAND_MAX + 1.0));
}
int main (int argc, char* const argv[]) {
int fd;
void* file_memory;
/* Инициализация генератора случайных чисел. */
srand(time(NULL));
/* подготовка файла, размер которого будет достаточен для
записи беззнакового целого числа. */
fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
lseek(fd, FILE_LENGTH+1, SEEK_SET);
write(fd, "", 1);
lseek(fd, 0, SEEK_SET);
/* Создание отображаемой области. */
file_memory =
mmap(0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
/* Запись случайного числа в отображаемую память. */
sprintf((char*)file_memory,
"%d ", random_range(-100, 100));
/* Освобождение памяти (не обязательно, так как программа
завершается). */
munmap(file_memory, FILE_LENGTH);
return 0;
}
Программа mmap-write пытается открыть файл и, если он не существует, создает его. Третий аргумент функции open() указывает на то, что файл доступен для чтения/записи. Поскольку длина файла неизвестна, с помощью функции lseek() мы убеждаемся в том, что файл имеет достаточную длину для записи беззнакового целого числа, а затем возвращаемся в начало файла.
Программа закрепляет файл за областью памяти и закрывает его дескриптор, так как в нем больше нет необходимости. После этого программа записывает случайное число в отображаемую память, т.е. в файл, и освобождает память. В принципе, вызывать функцию munmap() нет необходимости, так как ОС Linux автоматически освободит память при завершении программы.
Листинг 5.6. (mmap-read.c) Чтение случайного числа из файла, отображаемого в памяти
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#define FILE_LENGTH 0x100
int main(int argc, char* const argv[]) {
int fd;
void* file_memory;
int integer;
/* Открытие файла. */
fd = open(argv[1], O_RDWR, S_IRUSR | S_IWUSR);
/* Создание отображаемой области. */
file_memory =
mmap(0, FILE_LENGTH, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
close(fd);
/* Чтение целого числа и вывод его на экран. */
sscanf(file_memory, "%d", &integer);
printf("value: %d ", integer);
/* Удваиваем число и записываем его обратно в файл. */
sprintf((char*)file_memory, "%d ", 2 * integer);
/* Освобождение памяти (не обязательно, так как программа
завершается). */
munmap(file_memory, FILE_LENGTH);
return 0;
}
Программа mmap-read читает число из файла, а затем удваивает его и записывает обратно в файл. Сначала файл открывается для чтения/записи. Поскольку предполагается, что файл содержит число, проверка с помощью функции lseek(), как в предыдущей программе, не требуется. Чтение содержимого памяти и его анализ выполняет функция lseek(). Функция sprintf() форматирует число и записывает его в память.
Ниже показан пример запуска обеих программ. Им на вход передается файл /tmp/integer-file.
% ./mmap-write /tmp/integer-file
% cat /tmp/integer-file
42
% ./mmap-read /tmp/integer-file
value: 42
% cat /tmp/integer-file
84
Обратите внимание: значение 42 оказалось записано в файл на диске, хотя функция write() не вызывалась. Последующее чтение файла осуществлялось без функции read(). Целое число записывалось в файл и извлекалось из него в текстовом виде (с помощью функций sprintf() и sscanf()). Это сделано исключительно в демонстрационных целях. В действительности отображаемый файл может содержать не только текст, но и двоичные данные.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Примеры
Примеры При подготовке примеров автор руководствовался следующими соображениями:• Примеры должны предоставлять образцы обычного, наиболее характерного и практически полезного применения функций Windows.• Они должны соответствовать реальным ситуациям из сферы
Примеры
Примеры Этот раздел — своего рода «кулинарная книга» для программистов. Здесь я приведу ряд готовых примеров, которые вы сможете непосредственно использовать в качестве базиса для ваших проектов. Это не совсем готовые администраторы ресурсов — вы должны будете
Примеры программ
Примеры программ В качестве заключительной иллюстрации к обсуждавшимся выше вопросам приводятся фрагменты двух приложений, которые в достаточной степени демонстрируют практическое применение программного интерфейса UNIX. Заметим, что приведенные примеры не являются
5.12.5 Примеры
5.12.5 Примеры Программа на Рисунке 5.18 иллюстрирует искусственное использование каналов. Процесс создает канал и входит в бесконечный цикл, записывая в канал строку символов «hello» и считывая ее из канала. Ядру не нужно ни знать о том, что процесс, ведущий запись в канал,
Примеры
Примеры Теперь воспользуемся четырьмя только что написанными программами. Создадим очередь и поместим в нее три сообщения:solaris % msgcreate /tmp/no/such/fileftok error for pathname "tmp/no/such/file" and id 0: No such file or directorysolaris % touch /trap/test1solaris % msgcreate /tmp/test1solaris % msgsnd /tmp/test1 1 100solaris % msgsnd /tmp/test1 2 200solaris % msgsnd /tmp/test1 3
Примеры
Примеры Для начала мы создадим именованный семафор в Digital Unix 4.0B и выведем его значение, устанавливаемое по умолчанию при инициализации:alpha % semcreate /tmp/test1alpha % ls-l /tmp/test1-rw-r--r-- 1 rstevens system 264 Nov 13 08:51 /tmp/test1alpha %semgetvalue /tmp/test1value = 1Аналогично очередям сообщений Posix система создает файл
Примеры
Примеры Теперь мы продемонстрируем работу пяти приведенных выше программ и исследуем некоторые свойства семафоров System V:solaris % touch /tmp/richsolaris % semcreate –e /tmp/rich 3solaris % semsetvalues /tmp/rich 1 2 3solaris % semgetvalues /tmp/richsemval[0] = 1semval[1] = 2semval[2] = 3Сначала мы создали файл с именем /tmp/rich, который
Примеры
Примеры Создадим объект разделяемой памяти с именем /tmp/myshm объемом 123 456 байт в системе Digital Unix 4.0B:alpha % shmcreate /tmp/myshm 123456alpha % ls –l /tmp/myshm-rw-r--r-- 1 rstevens system 123456 Dec 10 14:33 /tmp/myshmalpha % od –c /tmp/myshm0000000 *0361100Мы видим, что файл с указываемым при создании объекта разделяемой памяти
Примеры
Примеры Создадим сегмент разделяемой памяти длиной 1234 байта в системе Solaris 2.6. Для идентификации сегмента используем полное имя нашего исполняемого файла shmget. Это имя будет передано функции ftok. Имя исполняемого файла сервера часто используется в качестве уникального
* ПРИМЕРЫ *
* ПРИМЕРЫ * b1_1_1.cxx #include ‹stream.hxx›main(){ cout ‹‹ "Hello, world ";}
Примеры
Примеры Книга содержит множество примеров. Все примеры комментируются по мере их приведения, и все же кое-что следует пояснить заранее.Из приведенного выше примера с map видно, что я обычно опускаю директивы #include и игнорирую тот факт, что компоненты STL принадлежат
ПРИМЕРЫ
ПРИМЕРЫ while(n++ < 100) printf(" %d %d ",n, 2*n + 1);while(fargo < 1000){ fargo = fargo + step; step = 2 * step;} В нашем последнем примере в цикле while используется "неопределенное" условие: мы не знаем заранее, сколько раз выполнится тело цикла перед тем, как выражение станет ложным. Во многих наших
ПРИМЕРЫ ПРОГРАММ С ШАБЛОНАМИ
ПРИМЕРЫ ПРОГРАММ С ШАБЛОНАМИ Эти примеры демонстрируют использование нового продукта STL ‹ToolKit› от компании ObjectSpace. STL ‹ToolKit› - это самый простой способ использования STL, который работает на большинстве комбинаций платформ/компиляторов, включая cfront, Borland, Visual C++, Set C++,
5.5.5. Примеры программ, работающих с локальными сокетами
5.5.5. Примеры программ, работающих с локальными сокетами Работу с локальными сокетами мы проиллюстрируем двумя программами. Первая (листинг 5.10) — это сервер. Он создает локальный сокет и переходит в режим ожидания запросов на подключение. Приняв запрос, сервер читает