C Linux:作为单例变量位于共享库中的全局变量
如果库被多个进程使用,是否可以将位于共享库(.so)中的全局变量用作单例 例如,初始值为0,进程1递增var,然后进程2递增val并打印它 到目前为止,我的实验表明,这两个进程都保留变量的副本,如果第一个进程增加它,第二个进程仍然会读取0。因此,该行为与Windows DLL不同 我在这里的一篇文章中读到,如果全局变量不是静态的(在lib中),并且在lib头中声明为extern,那么var对于所有进程都是唯一的。但到目前为止,我还不能做到这一点-var仍然是每个进程的副本 有人能很好地解释一下吗?以及如何执行…如果共享库(或Windows DLL)被多个进程使用,则任何可修改的数据仍然是该进程的私有数据。有一些机制,比如写时复制,只要相同的数据只被读取,就被共享,但一旦被任一进程写入,就被复制。因此,对于每个流程,数据仍然是分开的。另见C Linux:作为单例变量位于共享库中的全局变量,c,linux,shared-libraries,C,Linux,Shared Libraries,如果库被多个进程使用,是否可以将位于共享库(.so)中的全局变量用作单例 例如,初始值为0,进程1递增var,然后进程2递增val并打印它 到目前为止,我的实验表明,这两个进程都保留变量的副本,如果第一个进程增加它,第二个进程仍然会读取0。因此,该行为与Windows DLL不同 我在这里的一篇文章中读到,如果全局变量不是静态的(在lib中),并且在lib头中声明为extern,那么var对于所有进程都是唯一的。但到目前为止,我还不能做到这一点-var仍然是每个进程的副本 有人能很好地解释一下吗
如果要在进程之间共享数据,需要使用并确保在进程之间同步访问共享内存。每个进程都位于各自的内存空间中。(想象一下,只要加载其他进程正在使用的库,就可以完全任意地破坏它们的地址空间,这会对机器造成多大的破坏!)因此,全局变量是全局的,但只在一个进程内。Linux不支持共享链接器设置的全局变量。那个内存将在不可扫描的空间中 如果您只想与子进程共享数据(而不是与单独启动的任意进程共享数据,这些进程恰好链接到同一个共享库),那么最简单的方法是让库在构造函数中使用
mmap()
创建映射(最初在父进程中加载库时调用)
将
MAP\u ANONYMOUS
和MAP\u SHARED
标志传递给mmap
——这意味着继承映射的子进程将拥有一个与父进程(以及其他子进程)共享的映射每个进程的数据都是私有的-Windows DLL有什么不同?我想你想要的是在进程之间共享数据,对吗?我被告知Win DLL不是这样,但我想这不是真的…我想要一个单例,但不知道如何做…我有2个进程和1个库。一个“单例”通常意味着每个进程一个实例。好的,下面的注释说明我需要SharedMemory。是否可以从库中创建这样的内存,然后从使用库的每个进程中使用它?你是说在库shm_open()和mmap()中要初始化,然后从使用LIB的每个进程执行相同的操作-shm_open+mmap以使用空间?您可以与子进程共享数据,而不是在任意进程之间共享数据这里有点混乱:(我指的是这个示例:LIB创建共享内存,然后每个进程都可以访问相同的文件。对不起…我n00b。。。