Книга: Программирование для Linux. Профессиональный подход

Листинг 5.5. (mmap-write.c) Запись случайного числа в файл, отображаемый в памяти

Листинг 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,
  "%dn", random_range(-100, 100));
 /* Освобождение памяти (не обязательно, так как программа
    завершается). */
 munmap(file_memory, FILE_LENGTH);
 return 0;
}

Программа mmap-write пытается открыть файл и, если он не существует, создает его. Третий аргумент функции open() указывает на то, что файл доступен для чтения/записи. Поскольку длина файла неизвестна, с помощью функции lseek() мы убеждаемся в том, что файл имеет достаточную длину для записи беззнакового целого числа, а затем возвращаемся в начало файла.

Программа закрепляет файл за областью памяти и закрывает его дескриптор, так как в нем больше нет необходимости. После этого программа записывает случайное число в отображаемую память, т.е. в файл, и освобождает память. В принципе, вызывать функцию munmap() нет необходимости, так как ОС Linux автоматически освободит память при завершении программы.

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


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