4

そうしないと、Unix で割り当てられた共有メモリは自動的に破棄されますか?

たとえば、あるプロセスがそのセグメントを作成し、別のプロセスがそれを使用します。なんらかの理由で両方ともクラッシュしましたが、そのセグメントがメモリ リークの原因でしたか?

4

3 に答える 3

4

一般的にはそうではありません。

SysV共有メモリ(たとえば)を使用している場合はshm_open、いいえ。SysVIPCプリミティブはどれも自分自身をクリーンアップしません。常に明示的にクリーンアップするか、を使用して手動でクリーンアップする必要がありipcrmます。これは、私がそれらを使用しないことを強くお勧めするいくつかの理由の1つです。

共有メモリを取得するためにファイルにpingを実行している場合mmap、そのファイルは明らかに自然に消えることはありません。他のファイルと同様に、ファイルを削除するには、明示的にファイルを削除する必要がありますunlink。すでにそれを行っている場合は、すべて設定されています。

于 2012-07-16T16:42:39.740 に答える
1

それはあなたがセグメントに与える持続性に依存します。経験則として、名前shm_open(またはキー)を付けると、永続的になります。それが示すように、それを作成したプロセスを閉じた後も、何らかの方法で「削除」しない限り、それは持続しますshm_unlink。これは、完全に異なるプロセス間でセグメントを共有できる唯一の方法です。

ですから、そうするなら、あなたは本当に物事をきれいにするために注意を払わなければなりません。このような永続的なセグメントの最善の戦略は、最初にすべてのプロセスでファイル記述子を開き、すべてのプロセスが接続されたらすぐにリンクを解除することです。セグメントは、そのセグメントへの最後のファイル記述子が閉じられるまで存在します。

非永続セグメントは、を使用して匿名で直接マッピングできますmmap。プロセスが存在しなくなると、それらは消えます。

于 2012-07-16T21:58:23.000 に答える
0

いいえ。割り当てられた共有メモリ セグメントは、明示的に破棄する必要があります。

シュレッド メモリ セグメントの一覧表示と削除に便利なコマンド ライン ツール: ipcsおよびipcrm. 最後のものはexに使用できます。セグメントを使用しているすべてのプログラムがクラッシュしたときにセグメントを削除します。

于 2012-07-16T16:40:18.410 に答える