Запрос на MAP_PRIVATE

У меня есть запрос по MAP_PRIVATE. Как только я сопоставлю регион с помощью MAP_PRIVATE, я знаю, что внесенные мной изменения невидимы для других процессов. Но я просто хочу убедиться, что если какой-то другой процесс, который также работает в том же экземпляре, если он внесет некоторые изменения в файл mmap, эти изменения будут видны внутри моего процесса (который сопоставил его с помощью MAP_PRIVATE).

В основном мое требование состоит в том, что я хочу в один момент выполнить mmap файл в моем приложении, и условие состоит в том, что обновления, внесенные в этот файл другими процессами, не должны быть видны внутри моего процесса до тех пор, пока моя задача не будет выполнена. Так могу ли я безопасно использовать MAP_PRIVATE с помощью mmap?

Спасибо, Рам


person Rama P    schedule 04.08.2014    source источник
comment
Почему вы спрашиваете? Каков ваш процесс и другие процессы? Какое приложение вы кодируете?   -  person Basile Starynkevitch    schedule 05.08.2014


Ответы (1)


Внимательно прочтите несколько раз mmap (2) справочную страницу.

  MAP_PRIVATE
              Create a private copy-on-write mapping.  Updates to the
              mapping are not visible to other processes mapping the
              same file, and are not carried through to the underlying
              file.  It is unspecified whether changes made to the file
              after the mmap() call are visible in the mapped region.

Значит, вы попали в "неопределенное" дело

Вам необходимо иметь некоторую синхронизацию между другими процессами (запись в файл) и вашим процессом. См., Возможно, sem_overview (7) и mlock (2) и msync (2)

Если другие процессы произвольны (и вы не можете изменить их поведение), вы застряли. Это философия файлов Unix: произвольные процессы могут одновременно писать в один и тот же файл, но то, что происходит тогда, не всегда указывается (и может зависеть от файловой системы). Если вы хотите, чтобы несколько процессов записывали в один и тот же файл, они должны каким-то образом синхронизироваться и взаимодействовать (например, заблокировать с помощью flock (2) или lockf (3 ) и т.д ...).

Возможно, вам стоит использовать какую-нибудь систему баз данных вместо простых файлов! Например. sqlite выполнит некоторую синхронизацию за вас (конечно, при условии, что все процессы записываются в общий файл с использованием sqlite ...)

person Basile Starynkevitch    schedule 05.08.2014