多进程访问动态库全局变量问题

来源:互联网 发布:广联达软件要求 编辑:程序博客网 时间:2024/06/06 04:09

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

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

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


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

主程序采用fork的方式:

#include <stdio.h>
#include <unistd.h>


#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 0
原创粉丝点击