#c #variables #process #shared-libraries #permanent
#c #переменные #процесс #разделяемые библиотеки #постоянный
Вопрос:
Я хотел бы инициализировать комплексную переменную в общей библиотеке, но только один раз. После этого я хотел бы поделиться инициализированной переменной со всеми процессами, которые используют эту библиотеку.
Пример
- Допустим, вызывается библиотека
libgetx.so
, и у нее есть функцииint get_variable_x()
— который возвращает значение вызываемой переменнойx
.init_x(5)
— который инициализируетx
- Я хотел бы инициализировать
x
только один раз (возможно, при загрузке библиотеки) — представьте себе что-то дорогостоящее, например, разбор конфигурационного файла. - Теперь, каждый раз, когда я вызываю
get_variable_x()
процесс, связанный с общей библиотекой, я хотел бы иметь возможность считыватьx
. Но без ее повторной инициализации (поскольку она уже находится в другом процессе).
Возможно ли это? Я не уверен, что именно происходит в системе, когда вы вызываете функцию из общей библиотеки из разных процессов, но похоже, что они не разделяют одно и то же пространство.
Фактическая ситуация: я на Linux. Я хотел бы проанализировать конфигурационный файл yaml и получить значения конфигурации через общую библиотеку вместо того, чтобы снова и снова анализировать конфигурационный файл. Я использую yaml-pp и yaml-cpp-path для получения значений. Затем он вызовет, например get_config("something.id
, ) to get the
id`, который определен в файле yaml.
Комментарии:
1. Вы не можете сделать это с обычной переменной, но это именно то, для чего предназначены системы с разделяемой памятью. Однако такая система не стандартизирована в спецификации языка C. Существует несколько реализаций для разных платформ и даже для некоторых из одних и тех же платформ. Вам нужно быть более конкретным, если вам нужно больше, чем просто терминология.
2. @JohnBollinger Конечно, вы правы. Я добавил фактическую ситуацию. Надеюсь, это достаточно конкретно
Ответ №1:
Конкретный ответ о том, как это сделать, зависит от платформы, но вы хотите изучить все возможности общей памяти, предоставляемые вашей платформой. Короче говоря, вы бы настроили мьютекс или что-то эквивалентное и дождались разблокировки мьютекса.
Как только мьютекс разблокируется, точный порядок шагов зависит от того, как работает общая память на вашей платформе, но вам нужно будет создать / присоединить к сегменту памяти, выяснить, создал ли какой-либо другой процесс сегмент уже, и если нет, то записать в него общие данные.
После того, как все это будет сделано, отпустите мьютекс и продолжайте свой веселый путь.