【IPC通信】Posix消息队列的属性设置

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

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

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

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

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

下面通过程序获取和设置消息队列的默认属性:
01#include <stdio.h>
02#include <stdlib.h>
03#include <mqueue.h>
04#include <sys/types.h>
05#include <sys/stat.h>
06#include <unistd.h>
07#include <fcntl.h>
08#include <errno.h>
09 
10#define MQ_NAME ("/tmp")
11#define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag
12#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限
13 
14int main()
15{
16    mqd_t posixmq;
17    int rc = 0;
18 
19    struct mq_attr mqattr;
20 
21    // 创建默认属性的消息队列
22    posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL);
23    if(-1 == posixmq)
24    {
25        perror("创建MQ失败");
26        exit(1);
27    }
28   
29    // 获取消息队列的默认属性
30    rc = mq_getattr(posixmq, &mqattr);
31    if(-1 == rc)
32    {
33        perror("获取消息队列属性失败");
34        exit(1);
35    }
36    printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);
37    printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);
38    printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);
39    printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);
40 
41    rc = mq_close(posixmq);
42    if(0 != rc)
43    {
44        perror("关闭失败");
45        exit(1);
46    }
47 
48    rc = mq_unlink(MQ_NAME);
49    if(0 != rc)
50    {
51        perror("删除失败");
52        exit(1);
53    }
54 
55    return 0;
56}

编译并执行:

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

看下面如何设置:

 

01

#include <stdio.h>
02#include <stdlib.h>
03#include <mqueue.h>
04#include <sys/types.h>
05#include <sys/stat.h>
06#include <unistd.h>
07#include <fcntl.h>
08#include <errno.h>
09 
10#define MQ_NAME ("/tmp")
11#define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag
12#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限
13 
14int main()
15{
16    mqd_t posixmq;
17    int rc = 0;
18 
19    struct mq_attr mqattr;
20 
21    // 创建默认属性的消息队列
22    mqattr.mq_maxmsg = 5; // 注意不能超过系统最大限制
23    mqattr.mq_msgsize = 8192;
24    //posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL);
25    posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, &mqattr);
26    if(-1 == posixmq)
27    {
28        perror("创建MQ失败");
29        exit(1);
30    }
31    mqattr.mq_flags = 0;
32    mq_setattr(posixmq, &mqattr, NULL);// mq_setattr()只关注mq_flags,adw
33   
34    // 获取消息队列的属性
35    rc = mq_getattr(posixmq, &mqattr);
36    if(-1 == rc)
37    {
38        perror("获取消息队列属性失败");
39        exit(1);
40    }
41    printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);
42    printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);
43    printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);
44    printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);
45 
46    rc = mq_close(posixmq);
47    if(0 != rc)
48    {
49        perror("关闭失败");
50        exit(1);
51    }
52 
53    rc = mq_unlink(MQ_NAME);
54    if(0 != rc)
55    {
56        perror("删除失败");
57        exit(1);
58    }
59 
60    return 0;
61}

编译并执行:

 

1

[infor@s123 PosixMq]$ gcc -o mqattr mqattr.c -lrt
2[infor@s123 PosixMq]$ ./mqattr
3队列阻塞标志位:0
4队列允许最大消息数:5
5队列消息最大字节数:8192
6队列当前消息条数:0
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值