http://blog.sina.com.cn/s/blog_818dc7aa0100v3n3.html

操作共享内存,我们用到了下面的函数
==============================================
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmid = shmget( key_t shmkey , int shmsize , int flag );
(void *)shmaddr = shmat( int shmid , char *shmaddr , int shmflag );
int shmdt( char *shmaddr );

【shmget】—— 是用来开辟/指向一块共享内存的函数
 参数:
     shmkey    是这块共享内存的标识符,如果是IPC_PRIVATE,则表示使用系统分配的键值创建;
     shmsize   申请内存大小
     flag      标志、权限;
               当只有IPC_CREAT选项打开时,不管是否已存在该块共享内存,则都返回该共享内存的ID,若不存在则创建共享内存;
               当只有IPC_EXCL选项打开时,不管有没有该块共享内存,shmget()都返回-1;(即:单独使用该标志无意义)
               当IPC_CREAT | IPC_EXCL时, 如果没有该块共享内存,则创建,并返回共享内存ID,若已有该块共享内存,则返回-1;
 返回值:
        shmid  内存标识的ID
       
【shmat】—— 链接上指定ID标识的共享内存
 参数:
     shmid     内存标识ID,由shmget()函数返回;
     shmaddr   (输出参数)共享内存的首地址,同该函数返回值一致;
     shmflag   SHM_RDONLY 只读, 0 可读写;(SHM_COPY\SHM_MAP\SHM_RND不在此说明)
 
【shmdt】—— 断开链接的共享内存指针
 参数:
     shmaddr    调用函数shmat()链接上共享内存的指针;

当一个进程不再需要共享内存段时,它将调用shmdt()系统调用取消这个段,但是,这并不是从内核真正地删除这个段,而是把相关shmid_ds结构的 shm_nattch域的值减1,当这个值为0时,内核才从物理上删除这个共享段
========================================================

用来控制共享内存的shmctl()函数如下:
=========================================================
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl( int shmid , int cmd , struct shmid_ds *buf );

【shmctl】—— 控制共享内存
 参数:
     shmid   共享内存标识ID;
     cmd     IPC_STAT 得到共享内存的状态
             IPC_SET 改变共享内存的状态
             IPC_RMID 删除共享内存
     buf     是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定;
struct shmid_ds结构体

struct shmid_ds {

struct ipc_perm shm_perm;

int     shm_segsz;

time_t  shm_atime;

time_t  shm_dtime;

time_t  shm_ctime;

unsigned short  shm_cpid;

unsigned short  shm_lpid;

short   shm_nattch;

unsigned short   shm_npages;

unsigned long   *shm_pages;

struct vm_area_struct *attaches;

};

IPC_RMID 命令实际上不从内核删除一个段,而是仅仅把这个段标记为删除,实际的删除发生在最后一个进程离开这个共享段时。
==========================================================

总结:
shmdt(addr)使进程中的shmaddr指针无效化,不可以使用,但是保留空间。
shmctl(shmid,IPC_RMID,0) 删除共享内存,彻底不可用,释放空间。

转载于:https://www.cnblogs.com/javaexam2/archive/2012/04/05/2632843.html

shmdt() 与 shmctl() 的区别相关推荐

  1. c语言中shmget相关函数,共享内存函数(shmget、shmat、shmdt、shmctl)及其范例 - guoping16的专栏 - 博客频道 - CSDN...

    2014年4月2日共享内存函数(shmget.shmat.shmdt.shmctl)及其范例 - guoping16的专栏 - 博客频道 - http://doc.xuehai.net 登录 | 注册 ...

  2. Linux进程间通信:共享内存函数(shmget、shmat、shmdt、shmctl)及其范例

    共享内存函数由shmget.shmat.shmdt.shmctl四个函数组成.下面的表格列出了这四个函数的函数原型及其具体说明. 1.   shmget函数原型 shmget(得到一个共享内存标识符或 ...

  3. 什么是共享内存?在内存中的具体位置?shmget的具体使用原理以及其他关联函数(shmat ( ),shmdt ( ),shmctl ( ))、以及C++应用案例?mmap和shm的区别?

    共享内存(shared memory) 共享内存 1.背景 2.定义 3.两种方式(mmap上一篇博客说明) 3.2.shmget 3.2.1.使用流程和基本原理 3.2.2.函数原型(创建共享内存) ...

  4. 系统编程04-消息队列(ftok、msgget、msgsnd、msgrcv、msgctl、shmget、shmat、shmdt、shmctl、semget、semctl、semop)

    目录 一.linuxIPC对象 (Inter Process Communicate) 1.什么是IPC对象 1)想要操作文件(设备文件/dev): 2)想要操作消息队列: 2.查看系统中所有的IPC ...

  5. 共享内存函数(shmget、shmat、shmdt、shmctl)

    一:shmget函数:得到一个共享内存标识符或创建一个共享内存对象 1,头文件: #include <sys/ipc.h>#include <sys/shm.h> 2,函数说明 ...

  6. shmget物理内存_Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()...

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...

  7. Linux API-共享内存:shmget、shmat、shmdt、shmctl

    共享内存特性 共享内存存在于Linux内核中,可以使数据双向流动 系统内核的所有进程都可共享此内存空间 进程可直接访问共享内存,通信速度快.效率高 通常用信号量来实现进程对共享内存同步访问的控制 共享 ...

  8. LINUX共享内存使用常见陷阱与分析(转)

    所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段共 ...

  9. 11月26日:操作系统实验杂记 shmget(创建共享存储区) shmat(连接共享存储区) shmdt(断连共享存储区) shmctl(共享存储区控制)

    文章目录 函数语法介绍 1.创建共享存储区shmget 2.连接共享存储区shmat 3.断连共享存储区shmdt 4.控制共享存储区shmctl 示例程序代码 进程1代码 进程2代码 函数语法介绍 ...

最新文章

  1. jmeter插件 --PerfMon Metrics Collector监控工具的使用
  2. if you are alone with your mac connected to Internet
  3. linux目录删除不释放空间,删除linux文件后,磁盘空间未释放的解决办法
  4. WPF/MVVM 快速开发
  5. 支付宝支付同步回调url中携带参数的两种方法
  6. 【OpenCV】OpenCV函数精讲之 -- 鼠标操作
  7. python格式化输出宽度对齐_python 中 字符串格式化示例,输出格式没有达到指定宽度,求帮忙!...
  8. 系统集成资质 - 案例分析与常规题答案
  9. bzoj 1046: [HAOI2007]上升序列
  10. 天书夜读:从汇编语言到Windows内核编程
  11. python实现文件批量添加重命名
  12. mysql的db.opt文件_MySQL数据库的db.opt文件
  13. FlexPaper — 可以用来仿豆丁网、百度文库的PDF在线阅读功能
  14. 细胞自动机,那是什么?
  15. 世界500强面试题----反应能力
  16. Linux中的子shell是什么,怎么理解?
  17. 多臂赌博机Multi-Armed Bandit(MAB)
  18. 信息服务器v6,服务器ipv6设置
  19. 高效下载Google Drive中的大量文件
  20. 如何从Photoshop中提取笔刷到优动漫

热门文章

  1. LifseaOS 悄然来袭,一款为云原生而生的 OS
  2. iis php mysql 一键安装_LNMP(Nginx服务,MySQL 服务,安装PHP服务 手动安装技术文档)
  3. 计算开始到结束的时间_阿里钉钉首次战胜微信,云计算的涨停潮只是开始,远未结束...
  4. python培训比较好的机构有哪些-上海python培训比较好的机构
  5. python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...
  6. 电脑的发展史_新时代新征程,新华电脑教育母公司中国东方教育成功港股上市!...
  7. windows下安装TensorFlow(清华镜像)
  8. 【总结】有三AI所有GAN相关学习资料汇总,有图文、视频、代码实战等......
  9. 全球及中国新能源汽车电机市场未来发展方向与投资潜力研究报告2022版
  10. 全球与中国零售机器人市场发展模式创新与投资战略规划研究报告2022-2028年