2013-03-24 16 views
12

man pagesshmctl()については、Linuxで混乱しています。私は次のコマンドを使用します:shmctl (id , IPC_RMID , 0)共有セグメントを削除します。 man pagesはメモリの寿命について矛盾しているようです。共有メモリセグメントをshmctlで削除する

man pages状態:

IPC_RMID

マークセグメントが破壊されます。セグメントは、最後のプロセスがデタッチした後(つまり、関連する構造体shmid_dsの shm_nattchメンバがゼロのとき)にのみ実際に破棄されます。 発信者は所有者または作成者であるか、特権を持っている必要があります。セグメント が破棄マークされている場合、IPC_STATによって で検索された関連するデータ構造内のshm_perm.modeフィールドの(非標準)SHM_DESTフラグ が設定されます。

私が正しいだ場合、私はこれがあなたの両方が共有メモリにアタッチ二つのプロセス、(Process1Process2それらを呼び出すことができます)を持っている場合、Process1は、共有メモリを作成して添付し、切り離し、共有を破壊する可能性を意味信じますメモリに格納され、最終的に終了します。その後、メモリは、Process2もデタッチするまで存在します。

これは間違いありませんか?

第二に、この文を何man pages平均:

呼び出し側は、セグメントが最終的に破壊されていることを確認する必要があります。 それ以外の場合は、フォールトインしたページはメモリに残るか、 スワップに残ります。これは、それが削除対象のセグメントをマークするので、他のすべてのプロセスが削除されるメモリを確保するために切り離されるまでブロックするために必要があるだろう、Process1のように思われてしまう

。しかし、これは上記の陳述と矛盾しているようです。私はまた、これがどのように行われるのか分からないので(もしそれが行われると仮定されている)、そうであれば、これについてどうやって行くのか説明することができますか?

答えて

15

あなたの最初の推論は正しいです。共有セグメントは、IPC_RMIDとマークされ、最後のプロセスが切り離されるまで存在します。

2番目の断片の目的は、共有メモリを使用するソリューションでは、破壊のためにそれをマークする必要があること、または永遠にメモリ/スワップに残ることを思い出させることです。セグメントを作成した直後にIPC_RMIDを使用することをお勧めします。

メモリを正常に解放できない場合は、ipcsプログラムを使用して、残りのセグメントをリストすることができます。

関連する問題