我试图通过在库顶部定义静态全局变量来计算使用共享库的不同进程的数量。创建了一个共享库os.so并从main.c中调用它。代码如下。
/// cat os.c
#include <stdio.h>
static int count = 0;
void incre() {
++count ;
printf("Process using os.so is %d\n",count);
}
gcc -c -fpic os.c gcc -shared os.o -o os.so
/// cat main.c
#include <stdio.h>
#include <dlfcn.h>
void main() {
void (*ptr2) (void);
void *handle;
handle = dlopen("./os.so", RTLD_NOW);
if (handle == NULL) {
printf("failed to open library\n");
exit(2);
}
ptr2 = dlsym(handle,"incre");
ptr2();
getchar();
dlclose(handle);
}
gcc main.c -ldl生成a.out
现在我在单独的shell中运行了两个不同的a.out实例。令人惊讶的是,我从两个进程获得的输出与“使用os.so的进程为1”相同。由于count是一个全局变量,我希望它在共享库地址空间中递增。
此外,我从输出/ proc / pid / maps中观察到它们引用os.so的相同文件描述符的两个进程。
# cat /proc/1943/maps
00920000-00921000 r-xp 00000000 fd:01 298166 /home/user1/personal/programs/logic /libraries/os.so
# cat /proc/1944/maps
00152000-00153000 r-xp 00000000 fd:01 298166 /home/user1/personal/programs/logic /libraries/os.so
我的问题是为什么不使用os.so的所有进程共享全局数据?
如果我在os.so中的incre()
中声明静态变量,仍然没有共享?
它与windows dll一样吗?