2009-08-25 10 views
1

「mmap」について知っていますが、親プロセスによって割り当てられたメモリを共有し、クライアントプロセス私は一時ファイルを作成する必要があります。どうすれば親子プロセス間でメモリを共有することができますか?メモリが解放されると自動的に解放されます

ただし、プロセスが終了するとこのファイルは存在し続けます。

私は決してゴミを残してはいけないという教育を受けました。実生活とプログラミングの両方で。

解決策は、Linux、FreeBSD、およびSolarisで動作するはずです。

答えて

0

上記のように名前付きパイプが必要です。 - 親が書き込み、子供が

  • childpid_parentpidを読み込む - 子供は書き込み、parebt読み取り

    1. parentpid_childpid:あなたは、2本のパイプ(可能な場合)を使用することができます。

    これは私に役立ちます。考慮すべき特別なシナリオがあるかどうかをご記入ください。

  • 2

    このarticleは、共有メモリの非常に良い出発点です。

    しかし、競合状態とすべての精神的な同時処理のオーバーヘッドを避けるため、パイプを一般的に使用することをお勧めします。子プロセスを開くと、stdinとstdoutは親プロセスから読み書きできるファイル記述子です。

    +0

    申し訳ありません、これは私のソフトウェアの小さくて重要な部分です。できるだけ早くデータセットを交換できるようにする必要があります。 そして、私は並行性と競合条件について怖くはありません。私は、高速同時実行プログラミングを愛しています。しかし、ここでは、メインアプリケーションをクラッシュさせるべきではない安全でないプラグインをロードする可能性があるため、外部の子プロセスを呼び出す必要があります。 – Lothar

    +2

    あなたが物事の上にいるような音と、私がリンクしている記事は理にかなっています。 あなたは、親が共有バッファから読み込んだものを親のプライベートバッファにコピーして、明らかにそれを検証します。そして、ある時点では、カーネルがパイプで行うことをユーザーランドでやろうとしています。パイプがそれほど遅くならないかもしれません。 – Will

    0

    親にメモリを割り当てます。 このメモリは、親と子の両方で使用します。 メモリを親に解放する責任を与えます。 親を子に待機させる(システムコールを待つ)。 親は終了する前にメモリを解放します。

    また、より安全な側にするために、子供が出る前に親が生きているかどうかをチェックしてください。 そうでない場合は、子自体にメモリを解放してください。しかし、複数の子がある場合は、これは機能しません。

    メモリの最初の数ビットを使用して、このメモリを使用するプロセスの数を追跡できます。プロセスがメモリ使用を開始するたびに、このカウントがインクリメントされ、終了する前にカウントがデクリメントされます。カウントが0になると、メモリが解放されます。

    さらにもう一つのメソッドがあります。システムmalloc(または使用する関数)の上にある関数ownMallocを書きます。これは、割り当てられたすべてのメモリとそれを使用するプロセスを追跡します。それは定期的に割り当てられた異なるチャンクを通過し、使用されていないチャンクを解放します。

    1

    Mmapは通常、「匿名」モードをサポートしています。このモードではゴミが発生しません。 Solarisでのmanページの作業によれば、LInuxで動作しますが、FreeBSDについてはわかりません - マニュアルページを見て、MAP_ANONまたはMAP_ANONYMOUSを検索してください。

    +1

    そして、MAP_ANONYMOUSの前に、mmapの直後にファイルをunlink()するのに使ったトリックを追加しておきます。これにより、親プロセスと子プロセスが共有メモリを使用できるようになります。 – ondra

    +0

    えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええと、さて、私は "/ tmp/dummy"ファイルを生成するように試みることができます。しかしそれはまだいくらかのゴミを残す。 – Lothar

    +0

    'MAP_ANONYMOUS'を使用するときにファイル記述子として' -1'を渡します。 – caf

    0

    POSIX shm_open(3)とそれに関連する関数を使用して、ファイルでサポートされていないメモリをマップします。 shm_open()によって返されるファイル記述子は、親と子が存在しなくなった場合に自動的に閉じられるべきですが、常にそうであれば100%確実ではありません。たぶん、誰かがそれにもっと光を当てることができますか?

    +0

    申し訳ありません "shm"とposixセマフォーはFreeBSD上でとても壊れています(shmは設計上 - 私がFreeBSDメーリングリストの会話の後で見つけたものです)。 – Lothar

    0

    親プロセスでメモリを割り当て、子プロセスが実行されるまで待つか、他のタスクを実行させます。子プロセスが終了すると、親プロセスに戻ります。そこのメモリの割り当てを解除します。

    子プロセス(この場合、子プロセスが孤立していると言われる)の前に親プロセスを停止する必要がある場合は、exec()を使用して子プロセスを新しいプロセスとして開始します。

    関連する問題