Можно ли превратить сегмент разделяемой памяти в личную память? - PullRequest
3 голосов
/ 09 июня 2011

Скажем, у меня есть программа c (в среде linux), которая использует общую память для отправки данных в несколько процессов и из них. Допустим, позже в программе завершаются параллельные процессы, и у меня есть только один процесс. Теперь, но я хочу, чтобы fork () отключил другой процесс, однако на этот раз я не хочу, чтобы этот сегмент памяти был общим, я хочу, чтобы и родительский, и дочерний процессы могли изменять значения, не влияя друг на друга, как если бы это была личная память. Есть какой-либо способ сделать это; преобразовывать разделяемую память в личную, но занимают ли они то же пространство в виртуальной памяти, или копировать при записи разделяемую память?

1 Ответ

3 голосов
/ 09 июня 2011

Что ж, единственный способ, который я могу придумать из переносимого API POSIX, - это заставить дочернюю карту отображать какой-то новый сегмент того же размера где-то еще (произвольно), скопировать данные, а затем отсоединить исходный сегмент.и повторно присоедините новый сегмент к правильному адресу.Звучит ужасно.

Вы можете отсоединить новый сегмент после того, как закончите, чтобы другие люди не могли присоединиться к нему.

Теперь, когда я посмотрю на страницу руководства, если у вас есть FD кобъект shm, вы можете попробовать переопределить объект shm как MAP_PRIVATE в дочернем элементе по правильному адресу.Однако `` не указано, видны ли изменения, внесенные в файл после вызова mmap () в отображенной области. '', Поэтому вам нужно либо протестировать это и жить опасно, либо использовать другой метод.

...