2016-01-25 32 views
2

我試着寫一些C代碼處理在Linux中, 剪切內存,我不知道何時使用系統調用shmdt, 以及何時使用shmctl (segment_id, IPC_RMID, 0);shmdt標記爲刪除,C,LINUX

我看着shmdt的手冊頁,並閱讀了這句話:「shm_nattch減一 如果變爲0,段被標記爲刪除, 段被刪除。」

手冊頁提到的標記是什麼?是shmctl (segment_id, IPC_RMID, 0);? 和劑量這意味着如果有一個過程仍然連接,shmctl (segment_id, IPC_RMID, 0);將不會分離段?

如果有人可以解釋每次打電話的用量,我將不勝感激。 謝謝

+1

您是否考慮使用POSIX共享內存,請參閱[shm_overview(7)](http://man7.org/linux/man-pages/man7/shm_overview.7.html) –

+0

這是用於學校作業,我可以不使用POSIX。 但謝謝你! –

回答

3

shmdt()反轉shmat() -operation。

的shmat:地圖在一個進程的地址空間中的共享存儲器段

shmdt:取消映射它再次

shmctl (segment_id, IPC_RMID, 0);標記爲刪除段,這意味着,它是counteroperation在創建與shmget(..., IPC_CREAT)共享內存段。如果刪除時參考計數器爲0,則會立即刪除該段。否則,將刪除操作推遲到最後一個進程取消映射(或者明確使用shmdt(),或者通過終止隱式進行)。

+0

非常感謝你! –

0

取消映射從進程的地址空間利用系統調用 shmdt(shared memory start virtual address)共享存儲器映射,但刪除的共享存儲器段使用與shmctl()IPC_RMID命令ipcs
共享內存段數據結構在Linux內核中維護,因此刪除共享內存段意味着從內核中刪除或釋放數據結構。