2017-01-29 13 views
0

共有されていないと思われる共有ライブラリがありました。共有整数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にする方法を説明できますか?

答えて

2

共有ライブラリの意味を誤解しています。これは、ディスク上の内容から変化しないライブラリの共通のオンディスクおよびインメモリが、ライブラリにリンクされたすべてのプログラムに使用されることを意味します。ライブラリを使用しているすべてのプログラム/インスタンスが共通のデータを共有しているわけではありません。これはセキュリティと一般的なバグに対する悪夢であり、そのような振る舞いをするライブラリは、準拠しているC実装として静的リンクに耐えられないでしょう。

ちなみに、Win16のDLLは、あなたが想像したように動作しました。これは大きな間違いであり、Win32で行われた大きな変更の1つです。

+0

実行時に読み込まれる.soファイルは、何らかの置換で.TEXTセグメントに配置されるコードだけです。このコードは実行時にすべてのプロセスにコピーされますが、コンパイル時にはバイナリにパックされません。いくつかの変数を、いくつかの同期構造を使用して共有メモリによって実行できるプロセス間で共有したいとします。 – Anirudh

関連する問題