1

popen2 実装を介して 2 つのサブプロセス (32 ビット) を作成する 64 ビット アプリケーションがあります。すべてが C++ で書かれています。

メモリ内の同じオブジェクトにアクセスするには 2 つのサブプロセスが必要ですが、これを行う方法がわかりません。

私が正しく理解していれば、各サブプロセスは異なるメモリ マップを持つため、2 つの間でメモリ アドレスを渡すことはできません。

追加情報: ターゲット プラットフォームは Macですが、できるだけプラットフォームに依存しない回答を探しています。Mac 固有の回答で問題ありません。おそらく、他のプラットフォームではこのアプローチを使用しません。私はスレッドの使用について十分に知りません。サブプロセスは 32 ビットでなければならないため、このルートをたどりました。

4

2 に答える 2

2

共有メモリの概念を使用できます。これは、(OS サービスを使用して) 両方のサブプロセスから見えるメモリを割り当てることを意味します。

ウィキが推奨するように、boost.interprocessを使用して、プラットフォームに依存しないレベルで共有メモリを使用できます。

于 2013-01-19T12:13:03.833 に答える
1

難しい問題です。

各プロセスには独自のアドレス空間があることは正しいです。あるプロセスによって作成されたオブジェクトは、別のプロセスからアクセスできません。

共有メモリを使用して、そこにオブジェクトを配置することができます。複雑な点の 1 つは、一般に、共有メモリ セグメントが各プロセスのアドレス空間の異なるアドレスにマップされることです。これは、これらのオブジェクト内でポインターを使用できないことを意味します。これは、ポインターの代わりにインデックスを使用することで軽減できます。

さらに、プロセス A が 32 ビットでプロセス B が 64 ビットの場合、 などのプリミティブ型longは異なる幅を持つことができます。したがって、このようなシナリオでデータを共有する場合は、 などの固定幅型を使用する必要がありますint32_t

最後の複雑な問題の 1 つは同期です。別のプロセスがオブジェクトを読み取ったり変更したりしているときに、プロセスがオブジェクトを変更できる場合は、プロセス間同期を導入する必要があります。

于 2013-01-19T12:10:25.230 に答える