ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:599.54KB ,
资源ID:2151163      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2151163.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Posix消息队列.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Posix消息队列.docx

1、Posix消息队列Linux Posix消息队列 一,消息队列简介: 消息队列可以看作是一个消息链表。它具有随内核的持续性,即当使用该消息队列的进程结束,或者已关闭该消息队列,该队列中的消息不会随之消失,只有在内核重新初始化,即计算机重启之后才会消失,因此称为随内核的持续性,这点也是与管道和FIFO的区别。消息队列的另一个特性是,在某一个进程往消息队列写消息之前不需要另外某个进程在该消息队列上等待消息的到达,即不会像管道和FIFO那样,如果往管道或者FIFO中写数据时,如果没有一个进程已经将读端打开,那么写操作会被阻塞。当然,如果从消息队列读取数据时,消息队列为空是会阻塞的。 每个消息都是一条

2、记录,它有发送者赋予一个优先权,值越大优先级越高。 下图为一个消息队列可能的布局:该链表的头中含有当前队列的两个属性:队列中允许的最大消息数,每个消息的最大大小。二,相关函数解释:1 mq_open 所在头文件:#include 函数原型:mqd_t mq_open(const char *name, int 0flag,.mode_t mode, struct mq_attr *attr); 函数功能:创建消息队列。参数说明:name为消息队列的名字,根据消息队列的规则,为了更好的可移植性,该名字必须以开头,创建一个消息队列的时候无须路径,给出名字就好,其存放位置可由自己指定(创建前后都可以

3、,下面会讲到)。oflag:为O_RDONLY(只读),O_WRONLY(只写),O_RDWR(可读可写)之一,可能按位或上O_CREATE,O_EXCL(当消息已存在时,返回EEXIST错误到errno中),O_NONBLOCK(设置非阻塞)。mode和attr参数是可选,但是当实际操作是创建一个新队列时,即O_CREATE已指定,且要求创建的消息队列不存在,mode和attr参数是需要的。mode:表示创建消息对列的权限。由S_IRUSR,S_IWUSR,S_IXUSR,S_IRGRP,S_IWGRP,S_IXGRP,S_IROTH,S_IWOTH,S_IXOTH相或组成或者写成0777(

4、表示rwxrwxrwx)等用八进制表示也可以。attr:在linux内核源代码中struct_mqattr定义的源代码如下: 存放消息队列的属性。其中mq_flags为0,表示阻塞,为O_NONBLOCK为非阻塞。 函数返回值:在内核源代码中mqd_t类型的定义如下:typedef _kernel_mqd_t mqd_t;typedef int _kernel_mqd_t;若创建成功则返回消息队列的描述符,否则返回1。2mq_close函数:所在头文件:#include函数原型:int mq_close(mqd_t mqdes);函数功能:关闭已打开的消息队列,关闭后调用进程不可以再使用该描述

5、符,但其消息队列并没有被删除。一个进程终止时,它的所有打开着的消息队列都关闭,就像调用了mq_close一样。参数说明:mqdes为消息队列的描述符,即消息队列创建成功后的返回值。返回值:成功返回0,失败返回-1。3.mq_unlink函数 所在头文件:#include 函数原型:int mq_unlink(const char *name); 函数作用:从系统中删除名为name的消息队列。但删除的只是我们可以在系统中看见的文件的名字,但文件本身并没有被从磁盘上删除,除非该名称是文件的最后一个链接,并且该文件已关闭,才会将该文件真正从磁盘上删除。即如果某前该详细队列的文件还在其他进程中打开,那

6、么不会将其从磁盘上删除,又或者这是最后一个链接,但它还未关闭,即未执行mq_close操作,或打开它的进程未结束就执行mq_unlink,它也不会从磁盘上删除。 函数的参数:消息队列的名称,以开始。 函数的返回值:成功返回0,出错返回1。4mq_getattr函数 所在头文件:#include 函数原型:int mq_getattr(mqd_t mqdes, struct mq_attr *attr); 函数功能:获取mqdes指的消息队列的属性,存放到attr结构体中。 参数说明:mqdes为消息队列描述符,attr为上面解释的存放消息队列属性的结构体。 函数返回值:成功返回0,失败返回1。

7、5mq_setattr函数: 所在头文件:#include 函数原型:int mq_setattr(mqd_t mqdes, const struct mq_attr *attr, struct mq_attr *oattr); 函数功能:设置消息队列的属性,但是只使用attr结构体中的mq_flags属性,以设置(O_NONBLOCK)或清除(0)非阻塞标志。该结构体的另外三个属性被忽略,每个队列的最大消息数和每个消息的最大字节数都只能在创建时设置,当前队列中的消息数是随传送消息和读取消息的操作改变的,只能读取不能设置。如果oattr非空,那么指定队列的先前属性(4个)全将返回到由该指针指向

8、的结构体中。 参数说明:见上述函数功能中对attr和oattr的解释。 返回值:成功返回0,失败返回1。6mq_send函数: 所在头文件:#include 函数原型:int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio); 函数功能:给描述符mqdes指向的消息队列发送消息,大小为len,内容存放在ptr中,prio为优先级。 参数说明:mqdes为要发送消息的消息队列描述符,ptr为要发送的数据,len为消息的长度,prio为消息的优先级。 返回值:成功返回0,失败返回1。7mq_receive函数:

9、 所在头文件:#include 函数原型:ssize_t mq_receive(mqd_t mqdes, char *ptr, size_t len, unsigned int *proip); 函数功能:从描述符mqdes指向的消息队列中读取消息存放ptr中。 参数说明:mqdes为要从中读取消息的消息队列的描述符,ptr为存放接收到的消息的指针,len为接受的最大长度,该值不能小于能加到该消息对列上的最大大小,如果len小于该值,就立即返回EMSGSIZE错误。 返回值:成功返回读取消息的内容的字节数,出错返回1。8mq_notify函数: 所在头文件:#include,#include

10、函数原型:int mq_notify(mqd_t mqdes, const struct sigevent *notification); 函数功能:为指定队列建立或删除异步事件通知。 参数说明:在中: typedef union sigval int sival_int; void _user *sival_ptr; sigval_t;typedef struct sigevent sigval_t sigev_value; int sigev_signo; int sigev_notify; void (*sigev_notify_function)(union sigval); Pthr

11、ead_attr_t *sigev_notify_attributes; sigevent_t;(1).如果notification参数非空,那么当前进程希望在有一个消息到达所指定的先前为空的队列时得到通知。我们说“该进程被注册为接收该队列的通知”。(2).如果notification参数为空指针,而且当前进程目前被注册为接收所指定队列的通知,那么已存在的注册将被撤销。(3).任意时刻只有一个进程可以被注册为接收某个指定队列的通知。(4).当有一个消息到达某个先前为空的队列,而且已有一个进程被注册为接收该队列的通知时,只有在没有任何线程阻塞在该队列的mq_receive调用中的前提下,通知才会

12、发出。这就是说,在mq_receive调用中的阻塞比任何通知的注册都优先。(5).当该通知被发送给它的注册进程时,其注册即被撤销。该进程必须再次调用mq_notify重新注册(如果想要的话)。 返回值:成功返回0,失败返回1。三,相关程序示例:mq_create.c#include#include#include#include#include#include#includestruct mq_attr attr;int main(int argc , char *argv) int c, flags; mqd_t mqd; flags = O_RDWR|O_CREAT;/emz表示命令行的选

13、项,m和z带有参数 while(c = getopt(argc, argv, em:z:) != -1) switch(c) case e:flags |= O_EXCL; break; case m:attr.mq_maxmsg = atol(optarg); break; case z:attr.mq_msgsize = atol(optarg); break; if(optind != argc - 1) perror(optind error!n); if(attr.mq_maxmsg != 0 & attr.mq_msgsize = 0) | (attr.mq_maxmsg = 0

14、& attr.mq_msgsize != 0) perror(must specify both -m maxmsg and -z msgsize!n); mqd = mq_open(argvoptind, flags, 0644, (attr.mq_maxmsg != 0) ? &attr : NULL); if(mqd != -1) printf(create ok!n); mq_close(mqd); /mq_close只是关闭了描述符,并不删除消息队列 else printf(create error!n); exit(0); 运行过程及结果:从上可以看出,创建一个消息队列时,其最大消息数和每个消息的最大字节数不能超出,系统的msg_max和msgsize_max,否则创建失败。当然每个系统对应的这两个值都不同,可通过上面的cat路径进行查看。/mq1创建失败是因为在这之前已经创建了一个/mq1,e选项就是用来判断当创建的消息队列存在时,返回错误信息。编译时在最后一定要加上-lrt,表示链接。在消息队列的名字前一定要加/,这是Posix的规定,为了更好的可移植性。接下来我们要对消息队列进行挂载,只有挂载后你才能看见你的消

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1