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

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 <mqueue.h>  /*取得消息队列属性,放到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 

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

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <mqueue.h>
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6 #include <unistd.h>
 7 #include <fcntl.h>
 8 #include <errno.h>
 9
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
14 int 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
37     printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);
38     printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);
39     printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);
40     printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);
41
42     rc = mq_close(posixmq);
43     if(0 != rc)
44     {
45         perror("关闭失败");
46         exit(1);
47     }
48
49     rc = mq_unlink(MQ_NAME);
50     if(0 != rc)
51     {
52         perror("删除失败");
53         exit(1);
54     }
55     return 0;
56 } 

编译并执行:

1 root@linux:/mnt/hgfs/C_libary# gcc -o attrmq attrmq.c -lrt
2 root@linux:/mnt/hgfs/C_libary# ./attrmq
3 队列阻塞标志位:0
4 队列允许最大消息数:10
5 队列消息最大字节数:8192
6 队列当前消息条数:0
7 root@linux:/mnt/hgfs/C_libary# 

设置消息队列的属性:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <mqueue.h>
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6 #include <unistd.h>
 7 #include <fcntl.h>
 8 #include <errno.h>
 9
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
14 int 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
27     if(-1 == posixmq)
28     {
29         perror("创建MQ失败");
30         exit(1);
31     }
32
33     mqattr.mq_flags = 0;
34     mq_setattr(posixmq, &mqattr, NULL);// mq_setattr()只关注mq_flags,adw
35
36     // 获取消息队列的属性
37     rc = mq_getattr(posixmq, &mqattr);
38     if(-1 == rc)
39     {
40         perror("获取消息队列属性失败");
41         exit(1);
42     }
43
44     printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);
45     printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);
46     printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);
47     printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);
48
49     rc = mq_close(posixmq);
50     if(0 != rc)
51     {
52         perror("关闭失败");
53         exit(1);
54     }
55
56     rc = mq_unlink(MQ_NAME);
57     if(0 != rc)
58     {
59         perror("删除失败");
60         exit(1);
61     }
62
63     return 0;
64 } 

编译运行:

1 root@linux:/mnt/hgfs/C_libary# gcc -o setattrmq setattrmq.c -lrt
2 root@linux:/mnt/hgfs/C_libary# ./setattrmq
3 队列阻塞标志位:0
4 队列允许最大消息数:5
5 队列消息最大字节数:8192
6 队列当前消息条数:0

IPC通信:Posix消息队列的属性设置相关推荐

  1. Linux C 进程间的IPC通信 之 消息队列(2)

    Linux C 进程间的IPC通信 之 消息队列 双向通信 代码:(进程1) 1 #include <stdio.h>2 #include <sys/msg.h>3 #incl ...

  2. Linux C 进程间的IPC通信 之 消息队列(1)

    1.消息队列 与 共享内存 1-1 消息队列  和 管道 都属于 队列结构,读完了 就被删除 不存在,但 管道 是 顺序队列 ,而 消息队列 是 链式队列 1-2  消息队列 的读和写 可设为 阻塞模 ...

  3. linux进程间通信:POSIX 消息队列

    文章目录 基本介绍 相关编程接口 编程实例 消息队列通信实例 消息队列属性设置实例 基本介绍 关于消息队列的基本介绍,前面在学习system V的消息队列时已经有过了解,linux进程间通信:syst ...

  4. System V IPC POSIX IPC(一):消息队列

    System V IPC & POSIX IPC(一):消息队列 消息队列允许进程之间以消息的形式交换数据,是一种常见的进程之间的通信机制. 1. 消息队列的创建 System V IPC: ...

  5. Linux IPC POSIX 消息队列

    模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...

  6. Linux IPC实践(7) --Posix消息队列

    1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...

  7. 获取和设置消息队列的属性msgctl,删除消息队列

    消息队列的属性保存在系统维护的数据结构msqid_ds中,用户可以通过函数msgctl获取或设置消息队列的属性. int msgctl(int msqid, int cmd, struct msqid ...

  8. posix消息队列和systemV消息队列

    一.概述: 消息队列可认为是一个消息链表.有足够写权限的线程可往队列中放置消息,有足够读权限的 线程可从队列中取走消息.posix消息队列和systemV消息队列主要如下差异: 1.一般来说posix ...

  9. linux进程间通信:POSIX 消息队列 ----异步通信

    在上一篇中linux进程间通信:POSIX 消息队列我们知道消息队列中在消息个数达到了队列所能承载的上限,就会发生消息的写阻塞. 阻塞式的通信影响系统效率,进程之间在通信收到阻塞时并不能去做其他事情, ...

最新文章

  1. 《ASCE1885的网络编程》---Winsock APIのIP地址转换函数
  2. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
  3. blob显示在word编辑器中_你最头疼pdf转word,这里有最全面的转换方法,让工作更轻松...
  4. 解读Dataphin流批一体的实时研发
  5. head first servlet jsp 学习笔记
  6. socket编程流程与函数(实用篇)
  7. 获取系统信息1——linux系统中的时间
  8. linux 关闭桌面环境,Ubuntu 14.04上的Cinnamon桌面环境PPA被关闭
  9. js——引用类型和基本类型
  10. AMP、HMP、SMP
  11. 使用librtmp接收数据时要注意的问题
  12. UIUC计算机科学系博士,伊利诺伊大学香槟分校之计算机科学系
  13. android模拟qq进场动画,Android用ViewPager仿QQ实现多页面滑动及动画效果
  14. Arduino-ESP8266 控制舵机开门
  15. 10-38 A4-7在订单详细信息表中查找包含产品种类数超过特定值的订单信息 (20 分)
  16. Element表单验证规则
  17. 农村信息化服务亟待破解五大难题
  18. 移动硬盘启动win7蓝屏7b_电脑插入移动硬盘后,只要一点击移动硬盘中的文件夹就马上蓝屏...
  19. 旅游管理系统的出现,让一切旅行社管理问题变得简单
  20. 极限中0除以常数_极限考点总结1

热门文章

  1. html align 属性,align-content
  2. Mac使用工具tree,打印项目目录树到Markdown
  3. 推荐系统学习(二)基于用户/物品的协同过滤算法(User-CF / Item-CF)
  4. python使用random生成不重复的随机数
  5. Linux screen命令与后台执行任何程序
  6. java se开发_JAVA_SE基础——3.Java程序的开发流程
  7. 磁盘位置_Win10创建和附加虚拟硬盘|Win10怎么创建VHD虚拟磁盘
  8. PyChram使用技巧
  9. http://ju.outofmemory.cn/entry/307891---------TICK
  10. Java程序Date类型比较