ライブラリの上部に静的グローバル変数を定義することにより、共有ライブラリを使用してさまざまなプロセスの数を数えようとしています。共有ライブラリ 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 -共有 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 を生成します
現在、別のシェルで a.out の 2 つの異なるインスタンスを実行しています。驚いたことに、両方のプロセスから「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 を使用するすべてのプロセスでグローバル データが共有されないのはなぜですか?
incre()
os.so で静的変数を宣言しても、共有されませんか? Windows dllでも同じですか?