2010-11-18 8 views
3

いつWindowsで名前のない共有メモリを使用することを選択しますか?Un-named shared memoryはいつ使用されますか?

スレッド間のメッセージ受け渡しはあまり役に立ちません。代わりに、構造体/変数へのポインタをワーカースレッドに渡して、CreateFileMappingシステムコールを呼び出す代わりに、共有メモリとして代わりに使用することができます。

答えて

3

名前のない共有メモリを使用する理由の1つは、ファイルマッピングへのアクセスを、作成プロセスによってハンドルされたプロセスだけに制限することです。 - これは、サービス拒否攻撃を可能に

  • 名前を知っていて、マップファイルを作成するための十分なアクセス権を持つ任意のプロセスを予防またはその合法的な使用に干渉し、あなたの名前付きオブジェクトにしゃがむことができます。これには二つの問題を避けます。
  • 悪意のある名前の衝突ではなく、偶発的なものです。

名前を使用しないと、アクセスしたいプロセスのみが取得できることがわかります。単一のファイルマッピングオブジェクト

ハンドルを複製する、プロセス 作成時にハンドルを継承 介して複数のプロセスによって 共有、または 名前でファイルマッピングオブジェクトを開くことができる:MSDN docs for CreateFileMappingから。

3

セクションオブジェクト(別名「ファイルマッピングオブジェクト」)は、プロセス間でメモリを共有するために使用されるだけではありません。セクションオブジェクトの最も明白な使い方は、I/Oを行うためにファイルにマップすることであり、オブジェクト名を与えることはほとんどの場合あまり役に立ちません。名前のないページファイルバックアップセクション( "共有メモリ")では、子プロセスがハンドルを継承してセクションを使用できるようにすることができます。

+0

「I/Oを行うファイルにマップする」というまったく意味はありますか?テキストファイルのようなものであれば、ファイルへのハンドルをLPVOIDを介して必要とするスレッドに渡すだけです。 – aCuria

+0

私は、ファイルのマッピングにセクションオブジェクトを必要としないと言っています。それはあなたの質問に答えますよね? – wj32

3

プロセスの境界を越えて名前のないオブジェクトにハンドルを渡すことができます。つまり、実際には名前の付いていないメモリマップをアプリケーション内に作成し、別のからアクセスして、の名前を付けずにアクセスすることができます。

DuplicateHandle呼び出しを参照してください。この呼び出しは、プロセスの境界を越えて名前のないオブジェクトにハンドルを渡すために使用できます。

+0

この場合、名前付きオブジェクトを使用するだけではどうですか?名前のないものを使用する利点はありますか?共有メモリの名前を知っている限り、名前付き共有メモリのハンドルを取得することはできません。 – aCuria

+0

*実際の理由はありませんが、命名の競合を気にすることなくハンドルを動的に作成できます。さらに、 'Golbal'名前空間にオブジェクトを配置する必要はなく、セキュリティ権限が有効になっているオブジェクトにアクセスして他の誰かが開くことを防ぐこともできます。 –

+0

@aCuria - クライアント/サーバーアプリケーションでこれを行います。サーバーは、クライアントが検索できる共有メモリーの名前付き部分を作成します。接続ごとに、サーバーはその接続の名前のない共有メモリーを作成し、ハンドルに渡します。次に、クライアントとサーバーは、名前のない部分を使用して通信できます。これにより、同じサーバーへの任意の数の接続が可能になり、それぞれが他のサーバーに影響することはありません。 –

関連する問題