shmdt與shmctl的區別

參考:http://oss.org.cn/kernel-book/ch07/7.3.3.htm

先看看 shmctl() 

  原型: int shmctl ( int shmqid, int cmd, struct shmid_ds *buf );

  返回:成功爲 0 ,   失敗 爲-1

 

這個特殊的調用和semctl()調用幾乎相同,因此,這裏不進行詳細的討論。有效命令的值是: 

IPC_STAT :檢索一個共享段的shmid_ds結構,把它存到buf參數的地址中。 

IPC_SET :對一個共享段來說,從buf 參數中取值設置shmid_ds結構的ipc_perm域的值。 

IPC_RMID :把一個段標記爲刪除 


 IPC_RMID 命令實際上不從內核刪除一個段,而是僅僅把這個段標記爲刪除,實際的刪除發生在最後一個進程離開這個共享段時。

當一個進程不再需要共享內存段時,它將調用shmdt()系統調用取消這個段,但是,這並不是從內核真正地刪除這個段,而是把相關shmid_ds結構的 shm_nattch域的值減1,當這個值爲0時,內核才從物理上刪除這個共享段。


所以,如果我們能保證共享內存的每個進程最後都能調用到shmdt(),那麼我們就沒有必要再去調用shmctl(IPC_RMID)去刪除這個內存段了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章