我正在尝试理解外部变量在使用动态链接和动态加载共享库时是如何工作的,以及我继承的大型代码库是否存在问题。不幸的是,我不能从这个代码库中共享代码,并希望弄清楚这里是否存在特定问题。我想知道作为共享库一部分的变量是否可以从动态加载共享库的多个进程中变异。
这是main.c文件。
// main.c
#include <stdio.h>
#include <unistd.h>
#include "foo.h"
int main(void)
{
while(1){
printf("Value = %d\n", global);
foo();
}
return 0;
}
这是foo.c文件。
// foo.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int global = 0;
void foo(void)
{
global = global + 1;
sleep(1);
}
这是foo.h文件。
// foo.h
#ifndef foo_h__
#define foo_h__
extern void foo(void);
extern int global;
#endif // foo_h__
这是用于编译该程序的Makefile。
# Makefile
all: main
main:
gcc -c -Wall -Werror -fpic foo.c
gcc -shared -o libfoo.dylib foo.o
gcc -Wall -o test main.c -lfoo -L.
由于global
变量具有extern定义,并且由于创建了共享库,因此我预计在跨多个进程运行时代码会中断。但是,如果我打开两个终端并同时在它们中运行./test
,则计数器会独立且正确地递增(没有共同的共享内存)。我很高兴这是它的工作方式,但我很好奇是否有办法打破这个?通过阅读这些答案[1-2],我认为共享库内存只加载到虚拟内存空间一次,我假设上面的代码不起作用,即在启动第二个进程时第一个进程会重置为零。如何强制使用上面的代码来增加不同进程中相同内存地址的值?这有可能吗?