Книга: Программирование для 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()). Это сделано исключительно в демонстрационных целях. В действительности отображаемый файл может содержать не только текст, но и двоичные данные.

Оглавление книги


Генерация: 0.832. Запросов К БД/Cache: 4 / 1
поделиться
Вверх Вниз