Ç的Linux:全局变量位于共享库单(C Linux: Global variable locate

2019-08-08 13:20发布

是否有可能使用位于共享库(。所以)作为一个单独的全局变量,如果库由多个进程?

如实施例的初始值是0,过程1个递增变量,然后PROC2递增VAL并打印。

我的实验到目前为止表明,这两个过程保持变量的副本,如果第一个增量是第二个将仍然读取0,所以行为是不喜欢的Windows DLL ...

我在一篇文章中读到这里,如果全局变量不是静态的(在lib)和它的声明为在lib头中的var是所有过程固有外部量。 但到目前为止,我还没有能够做到这一点 - 变种仍在为每个进程复制。

是否有人可以提供这很好的解释? 而如何做到这一点?

Answer 1:

如果共享库(或Windows DLL)用于由一个以上的过程中,任何modifyable数据仍然私有的过程。 复制机制在相同的数据,只要它是只读共享的,但只要它是由两种工艺书面复制。 因此,每个进程的数据有效还是分开的。 另请参见共享库的地址空间 。

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



Answer 2:

每个进程活在自己的内存空间。 (如果可以的话,只需通过加载一些其他进程在使用,完全随意垃圾它们的地址空间库想象一下,你可以发泄的机器上的混乱!)所以,全局变量是全球性的,但仅限于一个过程。



Answer 3:

Linux不支持由链接器奠定了全局变量的共享。 该内存将是不能分享的空间。

如果你只是想与和后代的过程中(而不是与2单独启动任意进程,这恰好链接到同一个共享库)共享数据,然后做最简单的方法是有库中创建与映射mmap()在一个构造函数(当库最初加载在父进程被调用)。

MAP_ANONYMOUSMAP_SHARED标志来mmap -这将意味着继承映射的是子进程将拥有与父共享的映射(和其他的孩子)



文章来源: C Linux: Global variable located in shared library as singleton