【每個進程調用的動態庫中的全局變量都是一個拷貝,各自進程需要自己去初始化各自的全局,而且操作全局也互補影響】
【比如banker.c,在sghall里面有個初始化,在游戲進程里也有初始化,需要兩者共享變量得用共享內存或者其他進程間通訊】
Linux共享庫(動態庫)與進程之間共享全局變量可行性分析
概念就不多說了,下面主要討論一下在進程中使用共享庫(動態庫)聲明的全局變量的問題:
網上有一篇介紹在主程序中使用動態鏈接庫里的全局變量的文章,可能會給人一些誤導。首先,在主程序中可以使用動態鏈接庫中的全局變量是正確的,不可否認的,但這需要在程序編譯鏈接時就要把動態庫加上,並在需要使用的程序中使用extern聲明變量,這其實沒有達到動態庫的本質目的(使用時再調用);這其實不算是一個大問題,如果只在一個進程中使用也不會有問題,這里主要討論在多進程中使用動態庫全局變量的問題。
如果想在進程間依靠動態庫來共享全局變量恐怕是不太可能的事情,因為不同進程訪問動態庫時,是寫時拷貝,即如果另外一個進程試圖去修改動態庫中的全局變量時,系統就會把這個全局變量拷貝一份單獨給這個進程,而這個修改操作並不會影響到其他進程中變量的值。
測試結果:

可以看到,主進程首先修改了這個值,然后在子進程中讀取到的是主進程修改后的值,但是子進程中的修改並沒有影響到主進程中的使用的動態庫中的全局變量。所以
試圖使用動態庫在進程間共享全局變量的方法是行不通的。
附:編譯方法
gcc -fPIC-shared testshare.c -o libtestshare.so.2.0
gcc -o main -L/main main.c libtestshare.so.2.0
gcc -o main -L/main main.c libtestshare.so.2.0
./main