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