Ответ 1
Есть веские причины не допускать эту функциональность, особенно с точки зрения безопасности. API-интерфейс "share this mem" может подорвать систему разрешений доступа.
Просто предположим, что приложение хранит в памяти какую-то критическую/конфиденциальную информацию; ссылки приложения (например, с использованием разделяемой библиотеки, предварительной загрузки, модифицированного компоновщика/загрузчика) на любой компонент снаружи, а упомянутый компонент для простого удовольствия от него решает "разделить адресное пространство". Это было бы бесплатным для всех, способом обхода любого разрешения доступа/ограничения доступа к данным. Вы проложите путь в приложение.
Не подходит для вашего использования, признается, но скорее оправдан с точки зрения целостности системы/приложения. Попробуйте найти в Интернете уязвимость /proc/pid/mem mmap для некоторых объяснений, почему этот вид доступа не нужен (в общем).
Если используемая вами библиотека спроектирована таким образом, чтобы обеспечить такой общий доступ, она сама должна предоставить крючки для выделения такого общего буфера или использовать в другом месте - предварительно выделенный (и, возможно, общий) буфер.
Изменить. Чтобы это было ясно, граница процесса явно не касается совместного использования адресного пространства (между прочим).
Если вам требуется общее адресное пространство, либо используйте потоки (тогда все адресное пространство является общим, и никогда не нужно "ничего экспортировать" ), либо явно настроили область разделяемой памяти так же, как вы установили общий файл.
Посмотрите на это с последней точки зрения, два процесса, не открывающие его O_EXCL
, будут делиться доступом к файлу. Но если один процесс уже открыл его O_EXCL
, тогда единственный способ "сделать его общим" (открытый для другого процесса) - это close()
сначала, а затем open()
снова без O_EXCL
. Нет другого способа "удалить" эксклюзивный доступ из файла, который вы открыли как такового, кроме как закрыть его в первую очередь.
Так же как нет способа удалить эксклюзивный доступ к области памяти, отображаемой как таковой, кроме как сначала отменить ее, а для памяти процесса, MAP_PRIVATE
по умолчанию по умолчанию.
Дополнительно: буфер с общей памятью процесса не сильно отличается от общего файла процесса; используя семантику стиля SysV-IPC, вы имеете:
| SysV IPC shared memory Files ==============+=================================================================== creation | id = shmget(key,..., IPC_CREAT); fd = open("name",...,O_CREAT); lookup | id = shmget(key,...); fd = open("name",...); access | addr = shmat(id,...); addr = mmap(...,fd,...); | global handle | IPC key filename local handle | SHM ID number filedescriptor number mem location | created by shmat() created by mmap()
т.е. ключ - это "дескриптор", который вы ищете, передайте так же, как вы передадите имя файла, и обе стороны IPC-соединения затем смогут использовать этот ключ для проверки наличия общего ресурса, а также доступа (attach к ручке) содержимое, хотя это.