Является ли общая память для форка общей, если программа запускается с двух терминалов в Linux

Если в моем коде C++ я использую mmap() для совместного использования глобальной переменной и запускаю одну версию программы с терминала Linux, а на той же машине я открываю другой терминал и запускаю ту же программу, будут ли эти два программы обращаются к одной и той же памяти, которая является общей?


person Sera_Vinicit    schedule 18.04.2015    source источник


Ответы (2)


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

person Mike Seymour    schedule 18.04.2015

Два процесса увидят одно и то же содержимое области отображения памяти, только если

  • один и тот же файл отображается в обоих процессах
  • отображение в обоих процессах выполняется с флагом MAP_SHARED.

Если выполняется анонимное сопоставление файлов, резервного файла нет, и, следовательно, процессы не будут видеть содержимое друг друга. Для реализации разделяемой памяти вы можете либо создать файл в монтировании tmpfs (обычно для этого доступно /dev/shm). Или, в Linux, при достаточно свежем ядре (Linux 3.17 или новее) системный вызов memfd_create можно использовать для создания файла tmpfs без записи в файловой системе в одном процессе, а для совместного использования с другими процессами можно использовать передача файлового дескриптора, чтобы предоставить им доступ к этому файлу.

person datenwolf    schedule 18.04.2015