Если в моем коде C++ я использую mmap() для совместного использования глобальной переменной и запускаю одну версию программы с терминала Linux, а на той же машине я открываю другой терминал и запускаю ту же программу, будут ли эти два программы обращаются к одной и той же памяти, которая является общей?
Является ли общая память для форка общей, если программа запускается с двух терминалов в Linux
Ответы (2)
Это зависит от того, как вы используете mmap
. Если обе программы создают общее сопоставление одного и того же файла (или узла общей памяти или чего-то еще), да. Если они сопоставляют разные файлы или создают частные или анонимные сопоставления, нет (хотя приватное сопоставление будет использовать копирование при записи, поэтому память используется совместно до тех пор, пока какой-либо процесс не запишет в нее).
Два процесса увидят одно и то же содержимое области отображения памяти, только если
- один и тот же файл отображается в обоих процессах
- отображение в обоих процессах выполняется с флагом
MAP_SHARED
.
Если выполняется анонимное сопоставление файлов, резервного файла нет, и, следовательно, процессы не будут видеть содержимое друг друга. Для реализации разделяемой памяти вы можете либо создать файл в монтировании tmpfs
(обычно для этого доступно /dev/shm
). Или, в Linux, при достаточно свежем ядре (Linux 3.17 или новее) системный вызов memfd_create
можно использовать для создания файла tmpfs
без записи в файловой системе в одном процессе, а для совместного использования с другими процессами можно использовать передача файлового дескриптора, чтобы предоставить им доступ к этому файлу.