共有メモリは通常、プロセス間communicatioinの最速の形です。これは、プロセス間で共有されるメモリ領域を提供します。1つのプロセスが領域にデータを書き込むことができますし、別のプロセスがそれを読むことができます。
Boost.Interrprocessでクラスブースト::プロセス間:: shared_memory_objectは、共有メモリを表すために使用されます。
1.共有メモリを作成します
書式#include <ブースト/プロセス間/ shared_memory_object.hpp> の#include <iostreamの> 使用して名前空間ブースト::プロセス間。INT メイン(){ shared_memory_object shdmem(open_or_create、" ブースト" 、READ_WRITE)。 shdmem.truncate(1024 )。 std :: coutの << shdmem.get_name()<< はstd ::てendl; offset_tサイズ; もし(shdmem.get_size(サイズ)){ のstd :: COUT <<サイズ<< はstd :: ENDL。 } 戻り0 。 }
shared_memory_objectは、3つのパラメータを期待しています。最初のパラメータは、共有メモリを作成またはちょうど開かれるかどうかを指定します。後押し::プロセス間:: open_or_createは、それがすでに存在する場合は、共有メモリを開くか、そうでない場合は、共有メモリを作成します。
名前はブースト::プロセス間:: shared_memeory_objectのコンストラクタに渡された二番目のパラメータで指定されています。
第三のパラメータは、プロセスは、共有メモリにアクセスする方法を決定します。後押し::プロセス間を:: READ_WRITEは、プロセスが読み書きしたアクセスを言います。
型ブースト::プロセス間:: shared_memory_objectのオブジェクトを作成した後、対応する共有メモリブロックは、オペレーティングシステム内に存在します。このメモリ領域のサイズはバイト単位で共有メモリのサイズを渡すエリア、コールTRUNCATE()を使用するには、最初に0です。
get_name()とget_size()は、名前と、共有メモリのサイズを照会するために使用することができます。
前記共有メモリは、異なるプロセスbetwenデータを交換するために使用されているので、各プロセスは、そのアドレス空間に共有メモリをマッピングする必要があります。
書式#include <ブースト/プロセス間/ shared_memory_object.hpp> の#include <ブースト/プロセス間/ mapped_region.hpp> の#include <iostreamの> 使用して名前空間のブーストを::プロセス間。INT メイン(){ shared_memory_object shdmem(open_or_create、" ブースト" 、READ_WRITE)。 shdmem.truncate(1024 )。 mapped_region領域(shdmem、READ_WRITE)。 std :: coutの <<はstd ::進<< region.get_address()<< はstd ::てendl; std :: coutの <<はstd ::デク<< region.get_size()<< はstd ::てendl; int型 * I1 = static_castを< (region.get_address())。 * I1 = 99 ; mapped_regionのregion2に(READ_ONLY shdmem)。 std :: coutの <<はstd ::進<< region2.get_address()<< はstd ::てendl; std :: coutの <<はstd :: 12月<< region2.get_size()<< はstd ::てendl; int型 * I2 = static_castを< INT *> (region2.get_address()); std :: coutの << * I2 << はstd ::てendl; ブール = shared_memory_objectを削除::(削除" ブースト" ); std :: coutの <<はstd :: boolalpha <<削除<< はstd ::てendl; リターン 0 ;
出力は次のようになります。
0x7f6abbf76000
1024
0x7f6abbf74000
1024
99
真
後押し::プロセス間:: shared_memory_objectはブーストのコンストラクタ::プロセス間:: mapped_regionの最初のパラメータとして渡さなければなりません。第2のパラメータは、メモリ領域へのアクセスは、読み取り専用または読み書きされたか否かを判定する。アドレスとマッピングされたメモリ領域のサイズは、メンバーつくのget_address()とget_size()を使用して、標準出力に書き込まれます。get_address()の戻り値は、オブジェクトごとに異なっています。
上記の例のように、領域は、共有メモリの先頭に数字99を書き込みます。region2には、共有メモリ内の同じ位置を読み取り、標準ouptuストリームに番号を書き込みます。両方のメモリ領域は、同じ基本共有メモリにアクセスするための領域とregion2に、プロセス内の異なるメモリ領域を表していても、プログラムは99 PRINT2。
共有メモリを削除するには、後押し::プロセス間を:: shared_memory_objectは、パラメータとして削除する共有メモリの名前を取り、静的メンバ関数の削除を()、提供しています。
場合はremove()
呼び出されることはありません、共有メモリは、プログラムが終了した場合でも存在し続けます。共有メモリが自動的に削除されるかどうかは、基礎となるオペレーティングシステムに依存します。システムが再起動したら、WindowsおよびLinuxを含む多くのUNIXオペレーティングシステムは、自動的に共有メモリを削除します。