linux动态库被多进程加载,多进程访问动态库全局变量问题

1、   如果你做的动态库里面有全局变量,而且你想让不同的进程通过动态库的全局变量实现共享访问,那是不可行的。

2、主进程如果访问动态库的全局变量是可以的,不过你需要在主进程中extern声明一下这个动态库中的全局变量,然后主进程就可以使用这个全局变量了。

进程1和进程2在使用动态库的时候实际上是代码段共享,而数据段和堆栈是独立出来,系统会自动拷贝一份内存给另一个进程,也就是说动态库的全局变量在fork后就变成了两个独立的空间,两个进程在对这个全局变量操作的时候就已经是在独立操作互不干涉了。

3、实例验证上面的说法:

主程序采用fork的方式:

#include

#include

#include "testshare.h"

extern int global_i;

extern int fork_i;

int main()

{

int i = 1000;

int k = 0;

printf("*******************************\n");

printf("In main process, before modify.\n");

printf("global_i = %d.\n", global_i);

printf("fork_i = %d.\n", fork_i);

global_i = 1555;

fork_i = 2000;

printf("*******************************\n");

printf("In main process, after modify.\n");

printf("global_i = %d.\n", global_i);

printf("fork_i = %d.\n", fork_i);

int pid;

pid = fork();

if(pid < 0)

{

}

else if(pid == 0)

{

printf("*******************************\n");

printf("In child process, before modify.\n");

printf("global_i = %d.\n", global_i);

printf("fork_i = %d.\n", fork_i);

while(1)

{

sleep(1);

//global_i++;

set_global(i++);

printf("%s, %d, k = %d\n", __FUNCTION__, __LINE__, k);

k = get_global();

fork_i++;

printf("%s, %d, global_i = %d, fork_i = %d\n", __FUNCTION__, __LINE__,k, fork_i);

}

}

else if(pid > 0)

{

/*延时等待子进程操作完*/

sleep(2);

printf("In main process again.\n");

printf("global_i = %d.\n", global_i);

printf("fork_i = %d.\n", fork_i);

printf("*******************************\n");

while(1)

{

sleep(2);

//global_i--;

set_global(i--);

printf("%s, %d, k = %d\n", __FUNCTION__, __LINE__, k);

k = get_global();

fork_i--;

printf("%s, %d, global_i = %d, fork_i = %d\n", __FUNCTION__, __LINE__,k, fork_i);

}

}

return 0;

}

动态库函数libshare.so:

#include "testshare.h"

int global_i = 1000;

int fork_i = 5000;

void set_global(int i)

{

global_i = i;

}

int get_global()

{

return global_i;

}

输出结果:

*******************************

In main process, before modify.

global_i = 1000.

fork_i = 5000.

*******************************

In main process, after modify.

global_i = 1555.

fork_i = 2000.

*******************************

In child process, before modify.

global_i = 1555.

fork_i = 2000.

main, 48, k = 0

main, 52, global_i = 1000, fork_i = 2001

In main process again.

global_i = 1555.

fork_i = 2000.

*******************************

main, 48, k = 1000

main, 52, global_i = 1001, fork_i = 2002

main, 48, k = 1001

main, 52, global_i = 1002, fork_i = 2003

main, 68, k = 0

main, 72, global_i = 1000, fork_i = 1999

main, 48, k = 1002

main, 52, global_i = 1003, fork_i = 2004

main, 48, k = 1003

main, 52, global_i = 1004, fork_i = 2005

main, 68, k = 1000

main, 72, global_i = 999, fork_i = 1998

main, 48, k = 1004

main, 52, global_i = 1005, fork_i = 2006

main, 48, k = 1005

main, 52, global_i = 1006, fork_i = 2007

main, 68, k = 999

main, 72, global_i = 998, fork_i = 1997

main, 48, k = 1006

main, 52, global_i = 1007, fork_i = 2008

main, 48, k = 1007

main, 52, global_i = 1008, fork_i = 2009

main, 68, k = 998

main, 72, global_i = 997, fork_i = 1996

main, 48, k = 1008

main, 52, global_i = 1009, fork_i = 2010

main, 48, k = 1009

main, 52, global_i = 1010, fork_i = 2011

main, 68, k = 997

main, 72, global_i = 996, fork_i = 1995

main, 48, k = 1010

main, 52, global_i = 1011, fork_i = 2012

main, 48, k = 1011

main, 52, global_i = 1012, fork_i = 2013

在这个函数中有几个变量:

(1)全局变量:global_i, fork_i

(2)局部变量: i,k

通过上面的打印可以看出:

(1)全局变量fork_i在父子进程中是独立的,父进程的改变并没有影响到子进程的数值,同时子进程的改变也没影响到主进程的数值。

(2)局部变量k和全局变量是同样的现象,父子进程都彼此干各自的事

(3)第一句打印

*******************************

In main process, before modify.

global_i = 1000.

fork_i = 5000.

*******************************

可以看出主进程在用的是动态库中的全局变量的值,也就是主进程可以使用动态库定义好的全局变量并且可以使用。

(4)第二和第三个的打印可以看到,父子进程的打印是相同的值,就是说子进程得到了父进程的一份拷贝。

(5)后面的打印可以看出父子进程从此对全局变量和局部变量独立了,两者不再有任何的影响了。

如果两个进程想用全局变量来实现数据共享是不可行的。如果想实现可以考虑用共享内存的方式。待续

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值