我试图通过在库顶部定义静态全局变量来计算使用共享库的不同进程的数量。创建了一个共享库 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
/// 猫 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 中运行 2 个不同的 a.out 实例。令人惊讶的是,我从两个进程中得到的输出与“Process using os.so is 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也一样吗?