- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单机形式下的多人聊天
进程间通信方式之:消息队列
UNIX早期通信机制之一的信号能够传送的信息量有限,而管道只能传送无格式的字节流,这无疑给应用程序开发带来了不便,消息队列(也称报文队列)则克服了这些缺点.
一、消息队列概述
消息队列从本质上是一链表,它是由一个消息一个消息串联起来的链表.可以将消息看做一个记录,每个具有特定的格式.其中一个进程可以向消息队列内按照一定的规则添加新消息,而另外一些进程则可以从消息队列中读走这些消息.
在Linux系统中,主要有两种消息队列:POSIX消息队列和系统V消息队列.后者目前被大量的使用.
1.POSIX:possible operate system interface可移植操作系统接口.
2.系统V消息队列是随内核持续的,只有在内核重启或人工删除时,该消息队列才会被删除.这里,随内核的持续性是指消息队列并不会随用户程序的结束而消失,除非内核重启或在用户的应用程序中删除了该消息队列,这样消息队列才会被删除.正因为消息队列的内核持续性,系统要求每个消息队列在系统范围内对应唯一的键值.所以,要获取消息队列的描述字,必须提供该消息队列的键值.这里的键值类似于磁盘上的文件,每个文件都需要一个文件名.
二、消息队列与管道的比较
1、消息队列允许一个或多个进程向它写入或读取消息.但消息队列中的消息有这样一个特点,当在一个进程中成功的读取了一条消息后,队列中的这条消息将被删除,其它进程将看不到该消息了.这点类似于管道.比如当读进程从管道内读取到数据后,其它进程将看不到这些数据了.
2、管道和命名管道的通信数据都采用先进先出的原则.而消息队列可以实现消息的随机查询,消息并不一定以先进先出的次序读取,也可以按照消息的类型读取,这比管道或命名管道更有优势.
三、消息队列的操作
常用消息队列的API有如下5种:
(1)键值的获取
在Linux中,消息队列的产生是依据消息队列的键值(key)而产生的,且key具有唯一性.
#include sys/types.h
#include sys/ipc.h
key_t ftok(char *pathname,char proj)
函数功能 :返回文件名对应的键值
参数pathname:路径文件名(通过文件名来获取该文件的键值)
参数proj :项目名(不为0的整数即可)
(2)消息的创建创建于打开
#include sys/types.h
#include sys/ipc.h
#include sys/msg.h
int msgget(key_t key,int msgflg)
函数功能 :利用键值(key)来创建或打开消息队列
参数key :键值,由ftok()函数获得.
参数msgflg:标志位
返回值 :与键值key相对应的消息队列描述字,该描述字的功能类
似于文件的文件描述符,或进程的ID.出错返回-1.
Attention!!!
msgflg(标志位)常用的几种形式:
1. IPC_CREAT:用于创建新的消息队列
2. IPC_EXCL:建议与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误.
3. IPC_NOWAIT:用户当读写消息队列时,要求无法得到满足,进程不阻塞.比如该消息队列已满,用户无法再向该消息队列内写入数据;或该消息队列已空,用户无法再从该消息队列内读出数据;此时在默认情况下进程会发生阻塞.但如果用户在该标志位处使用了标志位IPC_NOWAIT,则该进程将不会阻塞.
4. 0:这是标志位的默认值0,表示当读写消息队列时,要求无法得到满足,进程阻塞.
创建消息队列的方法:
若整个系统中没有和键值(key)相对应的消息队列,此时调用函数msgget,且标志位msgflg处使用IPC_CREAT,这样就创建了一个消息队列.
int open_queue(key_t keyval)
{
int qid;
if((qid=msgget(keyval,IPC_CREAT))==-1)
return (-1);
return qid; //返回该消息队列的ID
}
(3)向消息队列中发送消息
创建好了消息队列后,有些进程就可以向该消息队列内写入消息,有些进程就可以从该消息队列内读取消息.
#include sys/types.h
#include sys/ipc.h
文档评论(0)