Ако в моя c++ код използвам mmap() за споделяне на глобална променлива и стартирам една версия на програмата от терминала на linux и в същата машина отворя друг терминал и стартирам същата програма, тези две програмите имат достъп до същата памет, която е споделена?
Споделена ли е паметта за fork, ако програмата се изпълнява от два терминала в linux
Отговори (2)
Зависи как използвате mmap
. Ако и двете програми създадат споделено картографиране на един и същи файл (или възел на споделена памет или каквото и да е), да. Ако съпоставят различни файлове или създадат частни или анонимни съпоставяния, не (въпреки че частното съпоставяне ще използва копиране при запис, така че паметта се споделя, докато някой от процесите не запише в нея).
Два процеса ще видят едно и също съдържание на регион, картографиран в паметта, само ако
- един и същи файл се картографира и в двата процеса
- картографирането и в двата процеса се извършва с флага
MAP_SHARED
.
Ако правите анонимно картографиране на файлове, няма архивен файл и следователно процесите няма да виждат съдържанието един на друг. За да реализирате споделена памет, можете или да създадете файл в tmpfs
монтиране (обикновено /dev/shm
е наличен за това). Или, на Linux, като се има предвид достатъчно ново ядро (Linux 3.17 или по-нова версия), системното извикване memfd_create
може да се използва за създаване на tmpfs
файл без запис във файловата система в един процес и за споделяне с други процеси може да се използва преминаване на файлов дескриптор, за да им даде достъп до този файл.