Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux:作为单例变量位于共享库中的全局变量_C_Linux_Shared Libraries - Fatal编程技术网

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

C Linux:作为单例变量位于共享库中的全局变量,c,linux,shared-libraries,C,Linux,Shared Libraries,如果库被多个进程使用,是否可以将位于共享库(.so)中的全局变量用作单例 例如,初始值为0,进程1递增var,然后进程2递增val并打印它 到目前为止,我的实验表明,这两个进程都保留变量的副本,如果第一个进程增加它,第二个进程仍然会读取0。因此,该行为与Windows DLL不同 我在这里的一篇文章中读到,如果全局变量不是静态的(在lib中),并且在lib头中声明为extern,那么var对于所有进程都是唯一的。但到目前为止,我还不能做到这一点-var仍然是每个进程的副本 有人能很好地解释一下吗

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

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

到目前为止,我的实验表明,这两个进程都保留变量的副本,如果第一个进程增加它,第二个进程仍然会读取0。因此,该行为与Windows DLL不同

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

有人能很好地解释一下吗?以及如何执行…

如果共享库(或Windows DLL)被多个进程使用,则任何可修改的数据仍然是该进程的私有数据。有一些机制,比如写时复制,只要相同的数据只被读取,就被共享,但一旦被任一进程写入,就被复制。因此,对于每个流程,数据仍然是分开的。另见


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

每个进程都位于各自的内存空间中。(想象一下,只要加载其他进程正在使用的库,就可以完全任意地破坏它们的地址空间,这会对机器造成多大的破坏!)因此,全局变量是全局的,但只在一个进程内。

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。。。