5

私は、母プロセスによってフォークされ、使用/読み取られたいくつかのプロセスによってカウントアップされるはずのカウント変数を持っています。

マザープロセスのmain()関数でポインターを作成し、フォークされた子でそのポインターをカウントアップしようとしました。それはうまくいきません!住所はすべてのプロセスで同じですが、すべての子供は自分のコピーを持っているようです。

それを行うための最良の方法は何ですか?

4

7 に答える 7

15

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

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

于 2009-03-16T15:00:02.093 に答える
2

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

使用するIPCの別の形式を調べます。

于 2009-03-16T15:03:00.167 に答える
1

私の経験では、少なくとも 2 つのプロセス間で情報を共有したい場合、メモリへの void* ポインターだけを共有することはほとんどありません。あなたは見てみたいかもしれません

ブースト インタープロセス

これにより、プロセス間で構造化データ (「クラス」と「構造体」と読む) を共有する方法がわかります。

于 2009-03-17T09:54:43.147 に答える
0

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

例については、この記事を参照してください。

于 2009-03-16T15:34:33.460 に答える
0

いいえ、IPC またはスレッドを使用します。ファイル記述子のみが共有されます (ただし、シーク ポインターは共有されません)。

于 2009-03-16T15:01:32.323 に答える
0

共有メモリをチェックアウトすることをお勧めします。

于 2009-03-16T15:03:45.050 に答える
0

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

于 2009-03-16T15:22:21.087 に答える