Книга: Программирование для Linux. Профессиональный подход
Листинг 5.6. (mmap-read.c) Чтение случайного числа из файла, отображаемого в памяти
Листинг 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: %dn", integer);
/* Удваиваем число и записываем его обратно в файл. */
sprintf((char*)file_memory, "%dn", 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()
). Это сделано исключительно в демонстрационных целях. В действительности отображаемый файл может содержать не только текст, но и двоичные данные.
- Листинг 5.5. (mmap-write.c) Запись случайного числа в файл, отображаемый в памяти
- 3.1. Числа
- Возведение в квадрат числа, оканчивающегося на 5
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Класс StreamReader
- Эффективная работа с временными файлами сортировки
- Единое имя файла параметров InterBase
- Параметры конфигурационного файла InterBase
- How to read
- Числа с плавающей точкой
- 3.2.1.2. Начальное выделение памяти: malloc()
- 6. Совершенные числа