Linux下共享库中的全局变量,静态变量是否只有一份?
2011-10-19 13:46
295 查看
http://www.cnblogs.com/super119/archive/2011/03/26/1996099.html
当有多个程序使用同一个共享库的时候,我们都知道,多个程序有多个进程,但是共享库在内存中只有一份。所以问题来了:如果我在共享库中定义了全局变量,那 么全局变量是不是也只有一份?如果是这样,那么当多个进程都在使用这个共享库的时候,就有问题了。比如:我们在共享库中定义了一个全局变量 server_inited,用来表示一个socket server是否已经启动成功了,如果这个变量是TRUE,那么,下次用户调用启动server的函数的时候,这个函数一check这个变量,发现已经是 TRUE了,就不会再启动server了。这样就导致了一个进程调用过了一次启动server的函数之后,其他进程再调用这个函数就没有效果了。而很明 显,这样是不行的。
如果真的象上面所说,那么在编写共享库的时候,就不能使用任何全局变量了。这会非常的麻烦。
为此,我写了两个程序测试了一下,一个TestLib用来生成共享库,一个测试程序用来测试。
结论是:不会。共享库的代码段,也就是每个函数,可能在内存中只有一份,但是全局变量,包括静态变量,全局静态变量在每个进程中都有独立的copy。所以不会造成上面所说的问题。
当有多个程序使用同一个共享库的时候,我们都知道,多个程序有多个进程,但是共享库在内存中只有一份。所以问题来了:如果我在共享库中定义了全局变量,那 么全局变量是不是也只有一份?如果是这样,那么当多个进程都在使用这个共享库的时候,就有问题了。比如:我们在共享库中定义了一个全局变量 server_inited,用来表示一个socket server是否已经启动成功了,如果这个变量是TRUE,那么,下次用户调用启动server的函数的时候,这个函数一check这个变量,发现已经是 TRUE了,就不会再启动server了。这样就导致了一个进程调用过了一次启动server的函数之后,其他进程再调用这个函数就没有效果了。而很明 显,这样是不行的。
如果真的象上面所说,那么在编写共享库的时候,就不能使用任何全局变量了。这会非常的麻烦。
为此,我写了两个程序测试了一下,一个TestLib用来生成共享库,一个测试程序用来测试。
结论是:不会。共享库的代码段,也就是每个函数,可能在内存中只有一份,但是全局变量,包括静态变量,全局静态变量在每个进程中都有独立的copy。所以不会造成上面所说的问题。
相关文章推荐
- Linux下共享库中的全局变量,静态变量是否只有一份?
- Linux下共享库中的全局变量,静态变量是否只有一份?
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- 当调用的DLL中有全局变量时调用它的多个实例是否共享同一个全局变量
- 当调用的DLL中有全局变量时调用它的多个实例是否共享同一个全局变量
- 当调用的DLL中有全局变量时调用它的多个实例是否共享同一个全局变量?????
- 静态的属性: 只有"一份"(相当于全局变量)
- linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈
- 静态函数里定义的变量,不为所有对象共享,类的静态变量和类外全局变量区别,静态函数和普通函数区别
- Linux共享库(动态库)与进程之间全局变量是无法共享的
- linux线程使用读写锁共享全局变量
- linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈
- linux动态链接库全局变量共享问题&DLL共享数据段
- linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】
- rsync只有修改了全局变量才需要重启
- 全局变量和静态变量
- 05-php中的全局变量和静态变量
- 局部变量 局部静态变量 全局变量
- linux 堆、栈、全局变量存放
- 写单例模式引发的问题(静态变量,全局变量的应用)