2009-03-16 9 views
4

私は、私がフォークし、母プロセスによって使用/読みとったいくつかのプロセスによってカウントアップされるはずのカウント変数を持っています。C++:フォークされたプロセスを介してポインタを共有することは可能ですか?

私は、マザープロセスのmain()関数でポインタを作成し、そのポインタをフォークされた子で数えようとしました。それは動作しません!すべての子どもは、すべてのプロセスで同じアドレスであっても、自分のコピーを持っているようです。

これを行うにはどうすればよいですか?

+1

ここではBoost.Interprocessが役に立ちます。 http://www.boost.org/doc/libs/1_38_0/doc/html/interprocess.html – Functastic

答えて

15

各子は親プロセスのメモリを取得します(少なくとも何かを修正しようとするとすぐに)。プロセス間で共有する必要がある場合は、共有メモリまたは同様のIPCメカニズムを調べる必要があります。

ところで、なぜあなたはこれをコミュニティのWikiにしていますか?そのようにして回答を制限している可能性があります。

+0

よろしいですか。ありがとうございました!私はこのようなことを期待していた。なぜ私はすべてのプロセスで同じアドレスを持っているのか教えてください。メモリがコピーされたので、それは違うはずがありませんか? –

+0

いいえ、あなたが見るものは仮想メモリのアドレスであり、実際のものではありません。 –

+0

さようなら!ありがとうございました。 :)私はコミュニティウィキが評判を生み出していないことを知らなかった。ただFAQでそれを読んでください。ごめんなさい! –

0

いいえ、IPCまたはスレッドを使用します。ファイルディスクリプタのみが共有されますが、シークポインタは共有されません。

2

2つのプロセスが同じメモリを共有できません。フォークされた子プロセスがフォーク後に同じ基本メモリを共有するのは事実ですが、これを書き込もうとすると、オペレーティングシステムは別の場所に新しい書き込み可能スペースを割り当てます。

IPCの別の形式を参照してください。

0

共有メモリをチェックアウトしたい場合があります。

0

ポインタは常に同じプロセスにあります。 プロセスのプライベートアドレスです。プロセスのプライベートアドレスです。どのようなオペレーティングシステムでも、さまざまな種類のIPCメカニズムが利用できます。 Windows Messaging、共有メモリ、ソケット、パイプなどを選択できます。データの要件とサイズに応じて1つを選択します。別のメカニズムは、使用可能な仮想メモリAPIを使用してターゲットプロセスにデータを書き込み、対応するポインタでプロセスに通知することです。

0

シンプルなオプションの1つですが、共有カウントに適したIPCの限定された形式は、「共有データセグメント」です。 Windowsでは、#pragma data_segディレクティブを使用して実装されています。

たとえば、articleを参照してください。

1

少なくとも2つのプロセス間で情報を共有したいと思うなら、void *ポインタをメモリに共有することはほとんどありません。あなたはあなたにどのように構造化されたデータを共有するためのプロセス間(「クラス」と「構造体」を読んで)アイデアを与えることができ

Boost Interprocess

を見を持っている場合があります。

関連する問題