消息队列的系统限制

作者:冯老师,华清远见嵌入式学院讲师。

消息队列是System V的IPC对象的一种,用于进程间通信,会受到系统的限制,本文主要描述了三个限制。第一:议个消息的最大长度;第二:消息队列的最大容量;第三:最大消息队列数。

一、    一个消息的最大长度

示例程序如下:

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h> #define N 8192 typedef struct
{
long mtype;
char mtext[N];
}MSG; int main()
{
key_t key;
int msgid;
MSG buf; if ((key = ftok(".", 5)) == -1)
{
perror("ftok");
exit(-1);
} if ((msgid = msgget(key, 0666 | IPC_CREAT)) == -1)
{
perror("msgget");
exit(-1);
} memset(&buf, 'a', sizeof(buf));
buf.mtype = 100; if (-1 == msgsnd(msgid, &buf, N, 0))
{
perror("msgsnd 1");
exit(-1);
} printf("**\n"); return 0;
} 程序执行结果如下: linux@ubuntu:~/process/fifth$ ./a.out
msgsnd 1: Invalid argument 当N为8192时,可以成功执行,打印出’**”,当改成N为8193时,就出现了上面的错误,因此,消息队列中,每个消息的正文的最大长度为8192. 二、 消息队列的最大容量 示例程序如下: #include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h> #define N 8192 typedef struct
{
long mtype;
char mtext[N];
}MSG; int main()
{
key_t key;
int msgid;
MSG buf; if ((key = ftok(".", 5)) == -1)
{
perror("ftok");
exit(-1);
} if ((msgid = msgget(key, 0666 | IPC_CREAT)) == -1)
{
perror("msgget");
exit(-1);
} memset(&buf, 'a', sizeof(buf));
buf.mtype = 100;
if (-1 == msgsnd(msgid, &buf, N, 0))
{
perror("msgsnd 1");
exit(-1);
} if (-1 == msgsnd(msgid, &buf, N, 0))
{
perror("msgsnd 2");
exit(-1);
} if (-1 == msgsnd(msgid, &buf, 1, 0))
{
perror("msgsnd 3");
exit(-1);
} return 0;
} 程序执行结果如下: linux@ubuntu:~/process/fifth$ ipcs -q
------------------ Message Queues --------------------
key msqid owner perms used-bytes messages
0x0501451d 131076 linux 666 16384 2 可以看出,一个消息队列中的所有消息最多占16384字节。超过这个值后,发送函数msgsnd阻塞。 三、 最大消息队列数 示例程序如下: #include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <strings.h>
#define N 8192
typedef struct
{
long mtype;
char mtext[N];
}MSG; int main()
{
key_t key;
int msgid, i, n = 0;
MSG buf; for (i = 1; ; i++)
{
if ((key = ftok(".", i)) == -1)
{
fprintf(stderr, "ftok i=%d--%s\n", i, strerror(errno));
//perror("ftok");
exit(-1);
} if ((msgid = msgget(key, 0666 | IPC_CREAT | IPC_EXCL)) == -1)
{
if (errno == EEXIST)
break;
//fprintf(stderr, "msgget i=%d--%s\n", i, strerror(errno));
//perror("msgget");
exit(-1);
}
n++; }
printf("n=%d msgid=%d\n", n, msgid);
return 0;
} 程序执行结果,n为256. 该程序说明了,最多可以创建256个消息队列。

最新文章

  1. C语言中如何判断文件是否存在
  2. 读一篇Javascript问题贴的收获
  3. C#与Java对比学习:数据类型、集合类、栈与队列、迭达、可变参数、枚举
  4. T2 Func&lt;in T1,out T2&gt;(T1 arg)
  5. PHP: 手把手编写自己的 MVC 框架实例教程
  6. 攻城狮在路上(贰) Spring(四)--- Spring BeanFactory简介
  7. javaWeb 数据库连接池连接数据库
  8. web开发中,前端javascript代码的组织结构
  9. SQL Server 最小化日志操作解析,应用[手稿]
  10. 【HDOJ】3367 Pseudoforest
  11. 黑马程序员--&#160;C语言交换两个整数变量值几种函数比较
  12. HDU 2209 翻纸牌游戏(DFS)
  13. “/&quot;应用程序中的服务器错误
  14. Kubernetes之ServiceAccount
  15. 【中文版 | 论文原文】BERT:语言理解的深度双向变换器预训练
  16. SpringBoot 项目健康检查与监控(转)
  17. Maven项目main和test文件夹说明
  18. (1.1)mysql 选择合适的数据类型
  19. 图片素材类Web原型制作分享-Pexels
  20. Monkey学习笔记&lt;五&gt;:检查内存泄露

热门文章

  1. app启动其他应用
  2. IIS7 和IIS8.0 HTTP 错误 500.19 - Internal Server Error 问题的解决方式
  3. Entity Framework CodeFirst------使用CodeFirst方式建立数据库连接(一)
  4. notification.setLatestEventInfo(context, title, message, pendingIntent); undefined
  5. Junit简介和常用API
  6. list-style无颜色问题解决,list-style-type无颜色解决
  7. 正则表达式匹配(node.js)
  8. app包中的fragment和v4包中的fragment的使用的区别
  9. jquery生成UUID的方法
  10. 关于百度 UEditor的使用