Споделена ли е паметта за fork, ако програмата се изпълнява от два терминала в 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