Есть ли способ разделить переменную (в общей библиотеке) между процессами?

#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:

Конкретный ответ о том, как это сделать, зависит от платформы, но вы хотите изучить все возможности общей памяти, предоставляемые вашей платформой. Короче говоря, вы бы настроили мьютекс или что-то эквивалентное и дождались разблокировки мьютекса.

Как только мьютекс разблокируется, точный порядок шагов зависит от того, как работает общая память на вашей платформе, но вам нужно будет создать / присоединить к сегменту памяти, выяснить, создал ли какой-либо другой процесс сегмент уже, и если нет, то записать в него общие данные.

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