繁体   English   中英

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仍然是每个进程的副本。

有人可以提供一个很好的解释吗? 怎么做......

如果多个进程使用共享库(或Windows DLL),则任何可修改数据仍然是该进程的私有数据。 有一些机制,如Copy on Write ,只要只读取相同的数据,就会共享相同的数据,但只要它被任一进程写入就会被复制。 因此,对于每个流程,数据仍然是有效的。 另请参见共享库地址空间

如果要在进程之间共享数据,则需要使用共享内存 ,并确保在进程之间同步对共享内存的访问。

每个进程都在自己的内存空间中进行处理。 (想象一下,如果可能的话,你可以在机器上造成破坏,只需加载一个其他进程正在使用的库,完全随意地废弃它们的地址空间!)因此,全局变量是全局的,但仅限于一个进程中。

Linux不支持共享链接器列出的全局变量。 那段记忆将处于不可磨灭的空间。

如果您只想与后代进程共享数据(而不是与单独启动的任意进程共享,那恰好恰好链接到同一个共享库),那么最简单的方法就是让库创建一个在构造函数中使用mmap()进行映射mmap()在最初在父进程中加载​​库时调用)。

MAP_ANONYMOUSMAP_SHARED标志传递给mmap - 这将意味着继承映射的子进程将具有与父级(以及其他子级)共享的映射

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM