linux 消息队列的限制
2024-09-23 13:34:58
消息队列的系统限制 作者:冯老师,华清远见嵌入式学院讲师。 消息队列是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个消息队列。
最新文章
- C语言中如何判断文件是否存在
- 读一篇Javascript问题贴的收获
- C#与Java对比学习:数据类型、集合类、栈与队列、迭达、可变参数、枚举
- T2 Func<;in T1,out T2>;(T1 arg)
- PHP: 手把手编写自己的 MVC 框架实例教程
- 攻城狮在路上(贰) Spring(四)--- Spring BeanFactory简介
- javaWeb 数据库连接池连接数据库
- web开发中,前端javascript代码的组织结构
- SQL Server 最小化日志操作解析,应用[手稿]
- 【HDOJ】3367 Pseudoforest
- 黑马程序员--&#160;C语言交换两个整数变量值几种函数比较
- HDU 2209 翻纸牌游戏(DFS)
- “/";应用程序中的服务器错误
- Kubernetes之ServiceAccount
- 【中文版 | 论文原文】BERT:语言理解的深度双向变换器预训练
- SpringBoot 项目健康检查与监控(转)
- Maven项目main和test文件夹说明
- (1.1)mysql 选择合适的数据类型
- 图片素材类Web原型制作分享-Pexels
- Monkey学习笔记<;五>;:检查内存泄露
热门文章
- app启动其他应用
- IIS7 和IIS8.0 HTTP 错误 500.19 - Internal Server Error 问题的解决方式
- Entity Framework CodeFirst------使用CodeFirst方式建立数据库连接(一)
- notification.setLatestEventInfo(context, title, message, pendingIntent); undefined
- Junit简介和常用API
- list-style无颜色问题解决,list-style-type无颜色解决
- 正则表达式匹配(node.js)
- app包中的fragment和v4包中的fragment的使用的区别
- jquery生成UUID的方法
- 关于百度 UEditor的使用