zoukankan      html  css  js  c++  java
  • [zz]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,当这个值为0时,内核才从物理上删除这个共享段。

     

    所以,如果我们能保证共享内存的每个进程最后都能调用到shmdt(),那么我们就没有必要再去调用shmctl(IPC_RMID)去删除这个内存段了。当然,我们也可以一开始就调用shmdt把这个内存断标记为删除,那么可以保证进程在离开这个共享段时(意外),可以保证删除这个共享内存。

  • 相关阅读:
    OpenLDAP备份和恢复
    OpenLDAP搭建部署
    Python正则表达式
    ansible学习
    Jenkins学习
    docker学习2
    让阿里告诉你, iOS开发者为什么要学 Flutter !
    用UIKit和UIView在视图上执行iOS动画
    iOS开发如何面对疫情过后的面试高峰期 !
    如何写好一个UITableView
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2847116.html
Copyright © 2011-2022 走看看