C Linux:全局变量作为单例位于共享库中

时间:2013-01-28 13:19:58

标签: c linux shared-libraries

如果库由多个进程使用,是否可以将位于共享库(.so)中的全局变量用作单例?

例如,初始值为0,进程1递增var,然后proc2递增val并打印它。

我的实验到目前为止显示两个进程都保留了变量的副本,如果第一个增加它,第二个仍然会读取0.所以行为不像Windows DLL ...

我在这里读了一篇文章,如果全局变量不是静态(在lib中)并且它在lib头中声明为extern,那么var对于所有进程都是唯一的。但到目前为止,我还没有完成这个任务 - var仍然是每个进程的副本。

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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