честно говоря, я не думаю, что разреженные файлы будут работать, но стоит попробовать.

отаю над переносом кода из AIX в Linux. Части кода используютshmat() системный вызов создавать новые файлы. При использовании сSHM_MAP в режиме записи можно расширить файл за пределы его первоначальной длины (в моем случае нуля):

Когда файл отображается на сегмент, ссылка на файл осуществляется путем доступа к сегменту. Система подкачки памяти автоматически заботится о физическом вводе / выводе. Ссылки после конца файла приводят к расширению файла с шагом в размер страницы. Файл не может быть расширен за пределы следующего сегмента.

(«Сегмент» в AIX представляет собой фрагмент адресного пространства размером 256 МБ, а «страница» обычно составляет 4 КБ.)

Что бы ялюбить сделать в Linux следующее:

Зарезервируйте большой кусок адресного пространства (он не должен быть таким большим, как 256 МБ, это не такие большие файлы)Установите биты защиты страницы таким образом, чтобы при первом доступе к странице, которая ранее не была затронута, генерируется ошибка по умолчаниюПри сбое страницы удалите бит «вызвать ошибку страницы» и выделите выделенную память для страницы, разрешив запись (или чтение), которая вызвала сбой страницы.После закрытия области общей памяти запишите измененные страницы в файл

Я знаю, что могу сделать это на Windows сVirtualProtect функция,PAGE_GUARD бит защиты памяти иструктурированный обработчик исключений, Каков соответствующий метод в Linux, чтобы сделать то же самое? Возможно, есть лучший способ реализовать эту функцию расширения при записи в Linux?

Я уже рассмотрел:

с помощьюmmap() с некоторым фиксированным большим размером, но я не могу сказать, какая часть файла была записана кодом приложениявыделение области анонимной разделяемой памяти большого размера, но, опять же, я не могу сказать, сколько области было написаноmmap() само по себе, похоже, не предоставляет никаких средств для увеличения длины файла резервной копии

Естественно, я хотел бы сделать это с минимальными изменениями в коде приложения.

Ответы на вопрос(3)

Ваш ответ на вопрос