How to share global variables in a shared library(.so) across instances of the same process that use the shared library in Linux?

后端 未结 3 1591
南旧
南旧 2020-12-16 23:10

I have a shared library(.so) that I preload before executing an application and I have a few global data structures in the shared library that the application uses. The appl

3条回答
  •  感动是毒
    2020-12-16 23:55

    To phrase this most clearly: you cannot do exactly what you asked. Linux does not support sharing of global variables that are laid out by the linker. That memory will be in unsharable mapped-to-swap space.

    A general recipe I can offer is this:

    1. define a struct that lays out your data. No Pointers! Just offsets.
    2. first process creates a file in /tmp, sets access rw as needed. Open, mmap with MAP_SHARED.
    3. Subsequent processes also open, mmap with MAP_SHARED.
    4. everybody uses the struct to find the pieces they reference, read, or write.
    5. Look Out For Concurrency!

    If you really only care about a parent and it's forked children, you can use an anonymous mapping and not bother with the file, and you can store the location of the mapping in a global (which can be read in the children).

提交回复
热议问题