各位看官们,大家好,上一回中咱们说的是SystemV IPC结构概述的样例,这一回咱们说的样例是:使用共享内存进行进程间通信

闲话休提。言归正转。让我们一起talk C栗子吧!

共享内存是SystemV IPC结构这样的抽象概念的一种具体对象。就和它的名字一样,它提供了一段内存空间供不同的进程使用,进程之间能够通过该内存空间传递数据,进而实现进程间的通信。

在介绍共享内存的用法之前,我们先介绍几个函数,这些函数都是用来操作共享的内存的。

shmget函数

int shmget(key_t key, size_t size,int shmflag)

该函数用来获取共享内存。函数返回共享内存的标识符。我们能够通过该标识符使用共享内存;

  • 第一个參数是键值,通过它来操作IPC在内核中的结构。也就是共享内存在内核中的结构;(上一回中介绍过)
  • 第二个參数是共享内存的容量。单位是byte;
  • 第三个參数是共享内存的权限标记,该权限和文件权限一样;
  • 该函数执行成功时返回共享内存标识符。否则返回-1;

在使用该函数的时候,我们须要自定义一个共享内存的类型,而且计算出该类型的内存空间。共享内存的类型能够根据程序须要来定义,常见的是定义一个结构体类型。

shmat函数

void * shmat(int shm_id, const void *shm_addr,int shmflg)

该函数用来把共享内存连接到进程的地址空间中,这样进程就能够使用共享内存了。

  • 第一个參数是共享内存的标识符,通过shmget函数能够获得;
  • 第二个參数是一个地址,该地址表示共享内存连接到进程中的位置;
  • 第三个參数是一个位标记,仅仅有三个值供使用:SHM_RND,SHM_RDONLY还有0;
  • 该函数执行成功时返回指向共享内存第一个字节的指针,否则返回-1。

在使用该函数的时候,第二个參数通常使用一个空指针,空指针表示让系统自己选择共享内存连接到进程地址空间的位置,这时第三參数能够使用SHM_RDONLY或者0。假设给第二个參数指定了地址。那么第三个參数须要使用SHM_RND。

shmdt函数

int shmdt(const void *shm_addr)

该函数用来把共享内存从进程的地址空间中分离出来,分离以后进程就不能使用共享内存了;

  • 第一个參数是一个地址,它是共享内存第一个字节的指针,也就是shmat函数的返回值。
  • 该函数执行成功时返回0,否则返回-1;

shmctl函数

int shmctl(int shm_id, int cmd,struct shmid_ds *buf)

该函数用来把共享内存连接到进程的地址空间中,这样进程就能够使用共享内存了;

  • 第一个參数是共享内存的标识符。通过shmget函数能够获得;
  • 第二个參数是一个命令。表示对共享内存的操作,仅仅有三个命令供使用:IPC_STAT,IPC_SET和IPC_RMID;
  • 第三个參数是一个结构体指针,该结构体中有共享内存的权限和全部者等信息。
  • 该函数执行成功时返回0,否则返回-1;

我们通常使用该函数删除共享内存。这时候须要给第二个參数赋值为IPC_RMID,表示删除共享内存,第三參数能够为空指针。

第二个參数的另外两个命令:

  • IPC_STAT表示把第三个參数中的内容和共享内存关联起来;
  • IPC_SET表示把第三个參数中的内容设置为共享内存的值。

第三个參数的类型,我们在上一回中提起过,它和SystemV IPC的结构相似,除了必须有的成员外,它还有自己特有的成员。

我从源码中找到了第三个參数的类型。具体的定义例如以下:(位于linux-4.0.3/include/linux/shm.h文件里)

struct shmid_kernel /* private to the kernel */
{       struct kern_ipc_perm    shm_perm;struct file             *shm_file;unsigned long           shm_nattch;unsigned long           shm_segsz;time_t                  shm_atim;time_t                  shm_dtim;time_t                  shm_ctim;pid_t                   shm_cprid;pid_t                   shm_lprid;struct user_struct      *mlock_user;/* The task created the shm object.  NULL if the task is dead. */struct task_struct      *shm_creator;struct list_head        shm_clist;      /* list by creator */
};

各位看官。关于使用共享内存进行进程间通信的样例咱们就讲到这里。

欲知后面还有什么样例,且听下回分解 。


一起talk C栗子吧(第九十五回:C语言实例--使用共享内存进行进程间通信一)...相关推荐

  1. 第九十五章 SQL函数 MINUTE

    文章目录 第九十五章 SQL函数 MINUTE 大纲 参数 描述 示例 第九十五章 SQL函数 MINUTE 返回日期时间表达式的分钟的时间函数. 大纲 {fn MINUTE(time-express ...

  2. 第十五回(二):文会内战平分秋色 树下阔论使坏心焦【林大帅作品】

    时光飞逝,转眼便至周五,亦是莉莉一行人歌咏大赛之日.当日兴化府,为那重阳妈祖祭典造势,这歌咏便是其一.故莉莉恩师率音乐生参战,因每年会试,那榜上题名的,文会总不如擢英,哲理.刘学监便剑走偏方,每每于宫 ...

  3. C语言第十次作业,第十五次c语言作业.doc

    <第十五次c语言作业.doc>由会员分享,可在线阅读,更多相关<第十五次c语言作业.doc(9页珍藏版)>请在人人文库网上搜索. 1.第十五次课作业:习题15-1:题码:章节: ...

  4. MySQL数据库教程之十五:MySQL触发器实例

    MySQL数据库教程之十五:MySQL触发器实例 准备工作: 先启动Navicat for MySQL,建立数据库 建立两个表:Goods(商品表).Orders(订单表) Goods(商品表) cr ...

  5. Oracle(11g)数据库教程之十五:Oracle触发器实例

    Oracle(11g)数据库教程之十五:Oracle触发器实例 准备工作: 先启动Oracle,连接数据库 建立两个表:Goods(商品表).Orders(订单表) Goods(商品表) create ...

  6. 数据结构(十五) -- C语言版 -- 树 - 二叉树的操作进阶之创建、插入、删除、查询、销毁

    内容预览 零.读前说明 一.概述 二.数据模型分析创建 2.1.节点的结构模型 2.2.操作函数结构模型 三.创建 四.插入 4.1.在树中的某一个叶子节点位置插入新节点 4.2.在树中的某一个非叶子 ...

  7. 用c语言赋值表示的例子,一起talk C栗子吧(第五回:C语言实例--数组巧妙赋值)...

    一起talk C栗子吧(第五回:C语言实例--数组巧妙赋值) 各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! ...

  8. 《东周列国志》第九十九回 武安君含冤死杜邮 吕不韦巧计归异人

    话说赵孝成王初时接得赵括捷报,心中大喜,已后闻赵军困于长平,正欲商量遣兵救援,忽报:"赵括已死,赵军四十余万尽降于秦,被武安君一夜坑杀,止放二百四十人还赵."赵王大惊,群臣无不悚惧 ...

  9. 《东周列国志》第九十八回 质平原秦王索魏齐 败长平白起坑赵卒

    话说须贾得命,连夜奔回大梁,来见魏王,述范睢吩咐之语,那送家眷是小事,要斩相国之头,干碍体面,难于启齿.魏王踌躇未决,魏齐闻知此信,弃了相印,连夜逃往赵国,依平原君赵胜去了.魏王乃大饰车马,将黄金百镒 ...

  10. [你必须知道的.NET]第二十五回:认识元数据和IL(中)

    说在,开篇之前 书接上回[第二十四回:认识元数据和IL(上)],我们对PE文件.程序集.托管模块,这些概念与元数据.IL的关系进行了必要的铺垫,同时顺便熟悉了以ILDASM工具进行反编译的基本方法认知 ...

最新文章

  1. js生成[n,m]的随机数
  2. EditText显示明文与密码
  3. 教你从零开始使用wordpress做为后台生成小程序(小白版教程)
  4. 【WEB安全】In0ri:基于深度学习的网站内容污染检测系统
  5. 【白皮书下载】《追本数源•开启产品智能化时代》| 产品指数级增长手册
  6. 面向对象之继承与派生
  7. Datatables 构建响应式
  8. MIT陈刚教授案件新进展,律师反诉美检察官利用不实信息制造舆情、干扰司法公正...
  9. 聊聊并发编程的10个坑
  10. 辽宁工业大学有没有计算机专业,辽宁工业大学(专业学位)计算机技术考研难吗...
  11. ubuntu下字体美化设置
  12. VB键码常数(速查)
  13. Linux 命令(103)—— unzip 命令
  14. 1042 cant get hostname for your address
  15. CPU+GPU异构集群搭建的总结说明
  16. YACC(BISON)使用指南
  17. endnote中科大版区别_EndNote X7
  18. tumblr安装包Android,Tumblr安卓安装包
  19. 收到我的小心心了吗?
  20. 小鸟 java_java 飞翔小鸟源码

热门文章

  1. php 怎么更新浏览器缓存文件在哪里,PHP 设置动态网页在浏览器的缓存
  2. Pytorch使用tensorboardX可视化
  3. java虚拟机的gc机制的优缺点_深入Java虚拟机之 -- 总结面试篇
  4. android 布局图片缩放,Android中进行图片缩放显示
  5. C语言编写——四则运算小游戏
  6. java 日期计算类_日期类的加减及java中所以日期类的操作算法大全
  7. python import as 实例化_python中import list,dictionary常量在class实例化时遇到的坑
  8. error: 'Can't connect to local MySQL server through socket '/data/3307/data/mysql.sock' (2)'
  9. Firefox 将添加画中画功能
  10. 大型网站架构系列:负载均衡详解