2013-03-24 81 views
12

對於shmctl(),我很困惑於linux man pages。我使用以下命令: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並且上一個進程分離。

第二個片段的目的是提醒你,在使用共享內存的解決方案中,你需要有一些進程將其標記爲銷燬,否則它將永遠留在內存/交換中。創建分段後立即使用IPC_RMID可能是個好主意。

如果您不確定是否已成功釋放內存,則可以使用ipcs程序列出剩餘的段。