Наше приложение зависит от внешней, поставляемой сторонней конфигурации (включая пользовательские функции управления движением/принятия решений), загружаемой как .so-файл.Как получить общий объект в общей памяти
Независимо от этого, он взаимодействует с внешними модулями CGI, используя кусок разделяемой памяти, где хранится почти все его изменчивое состояние, чтобы внешние модули могли его прочитать и изменить там, где это применимо.
Проблема в том, что для модулей CGI требуется много постоянных конфигурационных данных из .so, а главное приложение выполняет совершенно ненужное копирование между двумя областями памяти, чтобы сделать данные доступными. Идея состоит в том, чтобы сделать весь общий объект загруженным в общую память и сделать его доступным непосредственно для CGI. Проблема в следующем: как?
- dlopen и dlsym не предоставляют каких-либо средств для назначения места для загрузки SO-файла.
- Мы попробовали shmat(). Кажется, что это работает только до тех пор, пока какой-то внешний CGI не попытается получить доступ к общей памяти. Тогда область, на которую указывает, выглядит так же конфиденциально, как если бы она никогда не делилась. Может быть, мы делаем что-то неправильно?
- Загрузка .so в каждый скрипт, который в этом нуждается, не может быть и речи. Явный размер структуры, связанный с частотой вызовов (некоторые сценарии вызывают один раз в секунду для создания живых обновлений), и это встроенное приложение делает его недействительным.
- просто memcpy() в .so в shm тоже нехорошо - некоторые структуры и все функции взаимосвязаны с помощью указателей.
Хотя это прямо не отвечает на мой вопрос, я думаю, что это самое ближайшее. Мне еще предстоит увидеть полезный вызов shmat() со вторым параметром, отличным от NULL. –
Оставьте это NULL и дайте системе определить местоположение сегмента памяти, находящегося в состоянии ожидания, и верните ему свой адрес. – mloskot