1. 程式人生 > >shmdt與shmctl的區別

shmdt與shmctl的區別

先看看 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。真正把核心中的共享記憶體刪除還得用shmctl。