Это можно заставить работать, но, добавив обработчики сигналов в изображение, вы значительно усложните свои проблемы межпроцессного и межпотокового блокирования.Я хотел бы предложить альтернативный подход: зарезервировать поле на первой странице файла mmapped, чтобы указать ожидаемый размер структуры данных.Используйте fcntl
блокировки файлов для обеспечения доступа к этому полю.
Когда любой процесс хочет обновить размер, он берет блокировку записи, читает текущее значение, увеличивает его, msync
s страницы (достаточно использовать MS_ASYNC|MS_INVALIDATE
), , затем использует ftruncate
для увеличения файла, затем увеличивает его отображение файла и только после этого освобождает записьзамок.Если после взятия блокировки записи вы обнаружите, что файл уже больше требуемого размера, просто увеличьте сопоставление и снимите блокировку, не вызывайте ftruncate или не меняйте поле.
Это обеспечивает взаимодействиепроцессы никогда не уменьшат размер файла, а область памяти, отображаемая каждым процессом, всегда поддерживается выделенным хранилищем, поэтому вы никогда не должны получать SIGBUS
es.Обратите внимание, что размер файла на диске будет увеличиваться только при реальной записи в только что выделенное пространство благодаря магии разреженных файлов .