18

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

マニュアルページには次のように記載されています。

IPC_RMID

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

私が正しければ、これは、両方が共有メモリに接続する2つのプロセスがある場合(それらProcess1をとと呼びましょうProcess2)、Process1共有メモリを作成し、接続、デタッチ、共有メモリを破棄し、最終的に終了する可能性があることを意味すると思います。その後、メモリProcess2も切り離されるまで存在し続けます。

これは正しいです?

第二に、このステートメントはman pagesどういう意味ですか?

呼び出し元は、セグメントが最終的に破棄されることを確認する必要があります。そうしないと、障害が発生したページがメモリまたはスワップに残ります。

これによりProcess1、セグメントに削除のマークが付けられたため、メモリが確実に削除されるように、他のすべてのプロセスがデタッチされるまでブロックする必要があるように見えます。しかし、これは上記のステートメントと矛盾しているようです。また、これがどのように行われるのか(行われることになっている場合)もわかりません。その場合、私がこれをどのように行うかについても説明していただけますか。

4

1 に答える 1

20

あなたの最初の推論は正しいです。IPC_RMID共有セグメントは、マークが付けられ、最後のプロセスがデタッチされるまで存在します。

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

メモリが正常に解放されたかどうかわからない場合は、ipcsプログラムを使用して残りのセグメントを一覧表示できます。

于 2013-03-24T20:12:38.637 に答える