共有されていないと思われる共有ライブラリがありました。共有整数soShared
は、2番目のプロセスで2になるはずです。代わりに、プログラムの両方のインスタンスに対して1の値が得られます。linux共有のCライブラリが共有されていません
#pragma once
extern volatile int soShared;
共有ライブラリ自体、slc.c:
int soShared = 0;
共有リソースを使用するプログラム:この例では3つの部分、共有ライブラリヘッダ、slc.hがある
#include <unistd.h>
#include <stdio.h>
#include "slc.h"
int main() {
int value = 0;
++soShared;
for (;;) {
if (value != soShared) {
value = soShared;
printf("pid=%d, value=%d\n",getpid(),value);
}
sleep(1);
}
return 0;
}
これらは、コンパイルされ、
gcc -c -fPIC -o slc.o slc.c
gcc -shared -o libslc.so slc.o
gcc -o use_slc use_slc.c libslc.so
LD_LIBRARY_PATH=`pwd` ./use_slc &
sleep 1
LD_LIBRARY_PATH=`pwd` ./use_slc &
で二回実行します
しかし、両方とも出力はsoShared
です。彼らは共有されていません。これは私が理解することではなく、(A)誰かがlibslc.soの2番目の使用が2という値を持たない理由を説明し、(B)2つのプロセス間で実際に共有されるリソースをsoSharedにする方法を説明できますか?
実行時に読み込まれる.soファイルは、何らかの置換で.TEXTセグメントに配置されるコードだけです。このコードは実行時にすべてのプロセスにコピーされますが、コンパイル時にはバイナリにパックされません。いくつかの変数を、いくつかの同期構造を使用して共有メモリによって実行できるプロセス間で共有したいとします。 – Anirudh