博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【IPC通信】Posix消息队列的属性设置
阅读量:5895 次
发布时间:2019-06-19

本文共 2983 字,大约阅读时间需要 9 分钟。

  hot3.png

Posix消息队列的属性使用如下结构存放:

struct mq_attr{    long mq_flags; /*阻塞标志位,0为非阻塞(O_NONBLOCK)*/    long mq_maxmsg; /*队列所允许的最大消息条数*/    long mq_msgsize; /*每条消息的最大字节数*/    long mq_curmsgs; /*队列当前的消息条数*/};

队列可以在创建时由mq_open()函数的第四个参数指定mq_maxmsg,mq_msgsize。 如创建时没有指定则使用默认值,一旦创建,则不可再改变。

队列可以在创建后由mq_setattr()函数设置mq_flags 。

#include 
/*取得消息队列属性,放到mqstat地fh*/int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat);/*设置消息队列属性,设置值由mqstat提供,原先值写入omqstat*/int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat);均返回:若成功则为0,若出错为-1

下面通过程序获取和设置消息队列的默认属性:

#include 
#include
#include
#include
#include
#include
#include
#include
#define MQ_NAME ("/tmp")#define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限int main(){ mqd_t posixmq; int rc = 0; struct mq_attr mqattr; // 创建默认属性的消息队列 posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL); if(-1 == posixmq) { perror("创建MQ失败"); exit(1); } // 获取消息队列的默认属性 rc = mq_getattr(posixmq, &mqattr); if(-1 == rc) { perror("获取消息队列属性失败"); exit(1); } printf("队列阻塞标志位:%ld\n", mqattr.mq_flags); printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg); printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize); printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs); rc = mq_close(posixmq); if(0 != rc) { perror("关闭失败"); exit(1); } rc = mq_unlink(MQ_NAME); if(0 != rc) { perror("删除失败"); exit(1); } return 0;}

 编译并执行:

[infor@s123 PosixMq]$ gcc -o mqattr mqattr.c -lrt[infor@s123 PosixMq]$ ./mqattr 队列阻塞标志位:0队列允许最大消息数:10队列消息最大字节数:8192队列当前消息条数:0

看下面如何设置:

#include 
#include
#include
#include
#include
#include
#include
#include
#define MQ_NAME ("/tmp")#define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限int main(){ mqd_t posixmq; int rc = 0; struct mq_attr mqattr; // 创建默认属性的消息队列 mqattr.mq_maxmsg = 5; // 注意不能超过系统最大限制 mqattr.mq_msgsize = 8192; //posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL); posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, &mqattr); if(-1 == posixmq) { perror("创建MQ失败"); exit(1); } mqattr.mq_flags = 0; mq_setattr(posixmq, &mqattr, NULL);// mq_setattr()只关注mq_flags,adw // 获取消息队列的属性 rc = mq_getattr(posixmq, &mqattr); if(-1 == rc) { perror("获取消息队列属性失败"); exit(1); } printf("队列阻塞标志位:%ld\n", mqattr.mq_flags); printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg); printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize); printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs); rc = mq_close(posixmq); if(0 != rc) { perror("关闭失败"); exit(1); } rc = mq_unlink(MQ_NAME); if(0 != rc) { perror("删除失败"); exit(1); } return 0;}

编译并执行:

[infor@s123 PosixMq]$ gcc -o mqattr mqattr.c -lrt[infor@s123 PosixMq]$ ./mqattr 队列阻塞标志位:0队列允许最大消息数:5队列消息最大字节数:8192队列当前消息条数:0

 

2011-11-16  任洪彩  qdurenhongcai@163.com

转载请注明出处。

转载于:https://my.oschina.net/renhc/blog/35320

你可能感兴趣的文章
iOS开发-NSOperation与GCD区别
查看>>
扩展方法使用
查看>>
Win7 64位 php-5.5.13+Apache 2.4.9+mysql-5.6.19 配置
查看>>
HOJ 2245 浮游三角胞(数学啊 )
查看>>
spring mvc 和ajax异步交互完整实例
查看>>
Go语言开发第一个Hello,World
查看>>
不同页面之间实现参数传递的几种方式讨论
查看>>
JS辨别访问浏览器判断是android还是ios系统
查看>>
程序员进阶之路—如何独当一面
查看>>
Oracle数据库备份与恢复的三种方法
查看>>
提升SQLite数据插入效率低、速度慢的方法(转)
查看>>
启动Tomcat的小细节--MyEclipse
查看>>
Java线程池的使用以及原理
查看>>
iOS图像处理之Core Graphics和OpenGL ES初见
查看>>
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
PHP如何学习?
查看>>
谈教育与成长
查看>>
关于软件的任务到底是什么的思考
查看>>