![](/img/trans.png)
[英]How to access the global variable of executable in shared library (c - linux)
[英]C Linux: Global variable located in shared library as singleton
如果库由多个进程使用,是否可以将位于共享库(.so)中的全局变量用作单例?
例如,初始值为0,进程1递增var,然后proc2递增val并打印它。
到目前为止我的实验表明,两个进程都保留了变量的副本,如果第一个增加它,第二个仍然会读取0.所以行为不像Windows DLL ...
我在这里读了一篇文章,如果全局变量不是静态的(在lib中)并且它在lib头中声明为extern,那么var对于所有进程都是唯一的。 但到目前为止,我还没有完成这个 - var仍然是每个进程的副本。
有人可以提供一个很好的解释吗? 怎么做......
每个进程都在自己的内存空间中进行处理。 (想象一下,如果可能的话,你可以在机器上造成破坏,只需加载一个其他进程正在使用的库,完全随意地废弃它们的地址空间!)因此,全局变量是全局的,但仅限于一个进程中。
Linux不支持共享链接器列出的全局变量。 那段记忆将处于不可磨灭的空间。
如果您只想与后代进程共享数据(而不是与单独启动的任意进程共享,那恰好恰好链接到同一个共享库),那么最简单的方法就是让库创建一个在构造函数中使用mmap()
进行映射mmap()
在最初在父进程中加载库时调用)。
将MAP_ANONYMOUS
和MAP_SHARED
标志传递给mmap
- 这将意味着继承映射的子进程将具有与父级(以及其他子级)共享的映射
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.