參考: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)去刪除這個內存段了。