如果库由多个进程使用,是否可以将位于共享库(.so)中的全局变量用作单例?
例如,初始值为0,进程1递增var,然后proc2递增val并打印它。
我的实验到目前为止显示两个进程都保留了变量的副本,如果第一个增加它,第二个仍然会读取0.所以行为不像Windows DLL ...
我在这里读了一篇文章,如果全局变量不是静态(在lib中)并且它在lib头中声明为extern,那么var对于所有进程都是唯一的。但到目前为止,我还没有完成这个任务 - var仍然是每个进程的副本。
有人可以提供一个很好的解释吗?怎么做......
答案 0 :(得分:7)
如果多个进程使用共享库(或Windows DLL),则任何可修改数据仍然是该进程的私有数据。有一些机制,如写入时复制,只要它只被读取,就会共享相同的数据,但只要它被任一进程写入就会被复制。因此,对于每个流程,数据仍然是有效的。另请参阅shared library address space。
如果要在进程之间共享数据,则需要使用Shared Memory并确保在进程之间同步对共享内存的访问。
答案 1 :(得分:1)
在每个内存空间中处理每个内容。 (想象一下,如果可能,你可以在机器上造成破坏,只需加载一个其他进程正在使用的库,完全随意地废弃它们的地址空间!)所以,全局变量是全局的,但只是在一个进程中。
答案 2 :(得分:1)
Linux不支持共享链接器列出的全局变量。那段记忆将处于不可磨灭的空间。
如果您只想与后代进程共享数据(而不是与单独启动的任意进程共享,那恰好恰好链接到同一个共享库),那么最简单的方法是使用library在构造函数中创建一个带mmap()
的映射(在最初在父进程中加载库时调用)。
将MAP_ANONYMOUS
和MAP_SHARED
标志传递给mmap
- 这意味着继承映射的子进程将具有与父级(以及其他子级)共享的映射