6、IPC(二).pptVIP

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6、IPC(二)

第五章 进程间通信IPC 本章目标 消息队列 共享内存 信号量 消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个数据块的最大长度是有上限的,系统上全体队列的最大总长度也有一个上限 消息队列函数 msgget函数 作用:用来创建和访问一个消息队列 msgsnd函数(2-1) 作用:把一条消息添加到消息队列里去 msgsnd函数(2-2) 消息结构在两方面受到制约。首先,它必须小于系统规定的上限值;其次,它必须以一个“long int”长整数开始,接收者函数将利用这个长整数确定消息的类型 最好把消息结构定义为下面这个样子: struct my_message { long message_type; /* The data you wish to transfer*/ } msgrcv函数 作用:是从一个消息队列里检索消息 msgctl函数(2-1) 作用:消息队列的控制函数,与共享内存的控制 函数很相似 msgctl函数(2-2) 消息对列---接收者(2-1) 消息对列---接收者(2-2) 消息对列---发送者(2-1) 消息队列---发送者(2-2) 共享内存 共享内存概述(2-1) 共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中。 其他进程可以把同一段共享内存段“连接到”它们自己的地址空间里去。 所有进程都可以访问共享内存地址,就好像它们是有malloc分配的一样 如果一个进程向这段共享内存写了数据,所做的改动会立刻被有权访问同一段共享内存的其他进程看到 共享内存概述(2-2) 共享内存函数 共享内存使用的函数与信号量的很相似,涉及到的函数如下: shmget函数 作用:用来创建共享内存 shmat函数 作用:共享内存段刚被创建的时候,任何进程还都不能访问它,为了建立对这个共享内存段的访问渠道,必须由我们来把它连接到某个进程的地址空间,shmat函数就是用来完成这项工作的。 shmdt函数 作用:把共享内存与当前进程脱离开 shmctl函数(2-1) 作用:共享内存的控制函数 shmctl函数(2-2) 共享内存示例程序(3-1) 共享内存示例程序(3-2) 共享内存示例程序(3-3) 信号量 Dijkstra提出的“信号量”概念是共发程序设计领域的一项重大进步 信号量是一种变量,它只能取正整数值,对这些正整数只能进行两种操作:等待和信号 用两种记号来表示信号量的这两种操作: P(semaphore variable) 代表等待 V(semaphore variable) 代表信号 信号量的分类 最简单的信号量是一个只能取“0”和“1”值的变量,也就是人们常说的“二进制信号量” 可以取多种正整数值的信号量叫做“通用信号量” pv操作的定义 假设我们有一个信号量变量sv,则pv操作的 定义如下 P(sv):如果sv的值大于零,就给它减去1;如果sv的值等于零,就挂起该进程的执行 V(sv): 如果有其他进程因等待sv变量而被挂起,就让它恢复执行;如果没有进程因等待sv变量而被挂起,就给它加1 pv操作工作情况(2-1) pv操作工作情况(2-2) 两个进程共享着sv信号量变量。如果其中之一执行了P(sv)操作,就等于它得到了信号量,也就能够进入关键代码部分了。 第二个进程将无法进入关键代码,因为当它尝试执行P(sv)操作的时候,它会被挂起等待一个进程离开关键代码并执行V(sv)操作释放这个信号量 信号量函数 每一个信号量函数都能对成组的通用信号量进行操作,自然也可以完成对最简单的二进制信号量的操作 还经常需要用到头文件sys/types.h和sys/ipc.h semget函数 作用:创建一个新的信号量或者取得一个现有信 号量的键字 semop函数(2-1) 作用:改变信号量的键值 semop函数(2-2) semctl函数(2-1) 作用:允许我们直接控制信号量的信息 semctl函数(2-2) semctl函数里的command可以有许多不同的 值,下面这两个是比较常用的: SETVAL:用来把信号量初始化为一个已知的值,这个值在semun结构里是以val成员的面目传递的。 IPC_RMID:删除一个已经没有人继续使用的信号量标识码 int semget (key_t key,int num_sems,int sem_flag); key: 是一个整数值,不相关的进程将通过这个值去访问同一个 信号量 num_sems:需要使用的信号量个数,它几乎总是取值为1 sem_flags:是一组标

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档