不同的进程是否具有共享静态变量或通用副本的单独副本?

bho*_*ath 7 c linux shared-libraries shared-memory

我试图理解共享内存概念的基础.我试图创建一个具有一个函数和一个STATIC数组变量的共享库.我想通过该共享库的功能访问静态数组变量.

这是我的共享库

     //foo.c    
     #include <stdio.h>

    static int DATA[1024]={1 ,2 ,3 ,...., 1024};
    inline void foo(void)
    {
        int j, k=0;
        for(j=0;j<1024;j++)
        {
            k=DATA[j];
       }
        k+=0;    
    }
Run Code Online (Sandbox Code Playgroud)

我已按照共享库中的说明创建了共享库对象(libfoo.so)

现在我的问题是

1>如果我从两个不同的程序(program1和program2)访问foo(),那么program1和program2会有单独的foo()函数副本吗?

2> program1和program2 会有单独的静态DATA数组副本吗?

3>它们会加载到相同的物理内存位置吗?如果单独加载静态DATA数组,有没有办法强制/加载到相同的内存位置?

4>有没有办法找到为program1和program2存储静态DATA数组的位置?

我在linux下使用gcc.任何帮助将受到高度赞赏.谢谢.

hek*_*mgl 6

只有一种定义明确的方法可以在进程之间共享内存:共享内存.从不同进程访问此内存需要正确同步对该区域的访问(通过进程本身).如果不同步访问,它将导致UNIX/Linux/Windows等多任务操作系统上的灾难.

答案详细:

如果我从两个不同的程序(program1和program2)访问foo(),那么program1和program2会有单独的foo()函数副本吗?

不可以.当您的程序与共享库链接时,函数代码将在链接到该库的多个程序之间共享.

program1和program2会有单独的静态DATA数组副本吗?

是.不会共享任何数据.

它们会加载到相同的物理内存位置吗?如果单独加载静态DATA数组,有没有办法强制/加载到相同的内存位置?

不(但请阅读上面的共享内存)

有没有办法找到为program1和program2存储静态DATA数组的位置?

是的,您可以使用GDB找到它.但程序无法找到彼此.