Как совместно использовать глобальные переменные в общей библиотеке (.so) через экземпляры того же процесса, которые пользуются общей библиотекой в Linux?

не делайте Вас, на самом деле хотят что-то как:

html(head(script(type='text/javascript', content='var a = ...')),
body(h1('And I like the fact that 3 < 1'), p('just some paragraph'))

я думаю, что видел что-то как этот где-нибудь. Это было бы замечательно.

РЕДАКТИРОВАНИЕ: На самом деле, я пошел и записал библиотеку сегодня, чтобы сделать просто что : magictree

можно использовать его как это:

from magictree import html, head, script, body, h1, p
root = html(
         head(
           script('''var a = 'I love &aacute; letters''', 
                  type='text/javascript')),
         body(
           h1('And I like the fact that 3 > 1')))

# root is a plain Element object, like those created with ET.Element...
# so you can write it out using ElementTree :)
tree = ET.ElementTree(root)
tree.write('foo.xhtml')

волшебство в magictree находится в том, как импорт работает: Эти Element фабрики создаются при необходимости. Имейте , смотрят на источник , это на основе ответа на другой вопрос о StackOverflow .

7
задан Georg Schölly 29 March 2010 в 16:27
поделиться

3 ответа

Проще говоря: вы не можете делать именно то, что просили. Linux не поддерживает совместное использование глобальных переменных, установленных компоновщиком. Эта память будет находиться в нераспространяемом пространстве, отображаемом в подкачку.

Общий рецепт, который я могу предложить, таков:

  1. определите структуру, которая размещает ваши данные. Никаких указателей! Просто смещения.
  2. первый процесс создает файл в / tmp, устанавливает доступ rw по мере необходимости. Открыть, mmap с MAP_SHARED.
  3. Последующие процессы также открываются,
8
ответ дан 6 December 2019 в 21:14
поделиться

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

Передайте MAP_ANONYMOUS и MAP_SHARED флаги для mmap - это будет означать, что дочерние процессы, наследующие отображение, будут иметь отображение, которое используется совместно с родителем (и другими дочерними процессами). Затем библиотека должна хранить структуры данных, которые будут совместно использоваться в этом сегменте памяти mmap (точно так же, как если бы это была память, возвращенная из malloc ).

4
ответ дан 6 December 2019 в 21:14
поделиться

Как насчет создания простого канала в известном местоположении каталога, а затем заставить другие процессы открывать канал для чтения / записи a la fread / fwrite соответственно, для обмена данными ... сложная часть - обеспечить передачу данных по конвейеру таким образом, чтобы в этом случае не вызвать повреждения. Вышеупомянутое использование разделяемой памяти shm_ и mmap привязано к процессу, когда вы разветвляете код, это не проблема, поскольку код fork'd является частью исходного процесса! Надеюсь, это поможет.

С уважением, Том.

0
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: