8

ライブラリが複数のプロセスで使用されている場合、共有ライブラリ (.so) にあるグローバル変数をシングルトンとして使用することは可能ですか?

たとえば、初期値は 0 で、プロセス 1 が var をインクリメントし、次に proc2 が val をインクリメントして出力します。

これまでの私の実験では、両方のプロセスが変数のコピーを保持し、最初にインクリメントしても2番目はまだ0を読み取ることが示されました。したがって、動作はWindows DLLとは異なります...

グローバル変数が (lib で) 静的ではなく、lib ヘッダーで extern として宣言されている場合、var はすべてのプロセスで一意であるという記事をここで読みました。しかし、これまでのところ私はこれを達成できていません.varはまだプロセスごとにコピーされています.

誰かがこれについて良い説明を提供できますか? で、やり方は…

4

3 に答える 3

7

共有ライブラリ (または Windows DLL) が複数のプロセスで使用されている場合でも、変更可能なデータはそのプロセスに対してプライベートのままです。同じデータが読み取りのみである限り共有されますが、いずれかのプロセスによって書き込まれるとすぐにコピーされるCopy on Writeのようなメカニズムがあります。そのため、各プロセスのデータは効果的に分離されています。共有ライブラリ アドレス空間も参照してください。

プロセス間でデータを共有する場合は、共有メモリを使用、共有メモリへのアクセスがプロセス間で同期されていることを確認する必要があります。

于 2013-01-28T13:32:18.903 に答える
1

Linuxは、リンカによってレイアウトされたグローバル変数の共有をサポートしていません。その記憶は共有できない空間にあります。

子孫プロセスとだけデータを共有したい場合(別々に起動され、同じ共有ライブラリにリンクしている任意のプロセスとは共有したくない場合)、これを行う最も簡単な方法は、ライブラリにデータを作成させることです。コンストラクター関数でのマッピングmmap()(ライブラリーが最初に親プロセスにロードされるときに呼び出されます)。

MAP_ANONYMOUSMAP_SHAREDフラグをに渡しますmmap-これは、マッピングを継承する子プロセスが、親(および他の子)と共有されるマッピングを持つことを意味します

于 2013-01-28T13:44:07.117 に答える
1

プロセスはそれぞれ独自のメモリ空間に住んでいます。(他のプロセスが使用しているライブラリをロードするだけで、マシンに大混乱をもたらす可能性があることを想像してみてください!) したがって、グローバルはグローバルですが、プロセス内でのみです。

于 2013-01-28T13:35:26.977 に答える