linux 消息队列的限制
消息队列的系统限制 作者:冯老师,华清远见嵌入式学院讲师。 消息队列是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个消息队列。
linux 消息队列的限制的更多相关文章
- linux消息队列编程实例
转自:linux 消息队列实例 前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权 ...
- LINUX消息队列实战之一
前言 能说能抄能论皆不算,能写能打才是真功夫. 唠叨 反正我也是一个孤独的程序猿,多说一些奇奇怪怪的唠叨也无妨,第一次写消息队列,书本的东西和实战很不同,根据实战总结的一些注意事项会和大家分享,也敲打 ...
- linux消息队列通信
IPC机制 进程间通信机制(Inter Process Communication,IPC),这些IPC机制的存在使UNIX在进程通信领域手段相当丰富,也使得程序员在开发一个由多个进程协作的任务组成的 ...
- Linux消息队列应用
#include"sys/types.h" #include "sys/msg.h" #include "unistd.h" #includ ...
- linux消息队列操作
对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...
- linux消息队列的使用
消息队列 *消息队列是内核地址空间中的内部链表,通过内核在各个进程之间传递的内容.消息顺序发送到消息队列中,每个消息队列都有IPC标识符唯一地进行标识. msgbuf结构 struct msgbuf{ ...
- Linux消息队列
#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/ms ...
- Linux 消息队列编程
消息队列.信号量以及共享内存被称作 XSI IPC,它们均来自system V的IPC功能,因此具有许多共性. 键和标识符: 内核中的每一种IPC结构(比如信号量.消息队列.共享内存)都用一个非负整数 ...
- linux 消息队列
消息队列,这个可是鼎鼎大名,经常在某些地方看见大家那个膜拜,那个,嗯,那个... 那就给个完整的例子,大家欣赏就行,我一直认为不用那个,嗯@ 这个队列的最大作用就是进程间通信,你要非搞个持久化,那也行 ...
随机推荐
- NDK安装 eclipse 不出现NDK目录问题
android adt自带eclipse无法设置ndk路径 具体情况是 我在mac上搭建android环境 到android sdk官网下载r23版本的adt时自带的eclipse没有设置ndk路径的 ...
- 深入了解VSTS的Unit Test测试属性
深入的了解一下方法上带有的属性的含义.每个方法上几乎都带有TestMethod这个属性,我们直觉告诉我们,这肯定是表示被测试函数的意思.事实也正是如此,在Unit Test里,有许多测试属性,常用的如 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-系统小结
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-系统小结 不知不觉已经过了13讲,(本来还要讲多一讲是,数据验证之自定义验证,基于园友还是对权限这 ...
- [RxJS] Filtering operators: takeUntil, takeWhile
take(), takeLast(), first(), last(), those opreators all take number or no param. takeUtil and takeW ...
- CentOS iSCSI客户端使用配置
配置步骤: 1.查看安装是否安装iSCSI驱动 rpm -qa|grep iscsi 2.查看yum安装源 yum list |grep iscsi 3.安装iscsi驱动 yum install i ...
- [转] Mac 下 PostgreSQL 的安装与使用
在 mac 下,可以利用 homebrew 直接安装 PostgreSQL: 1 brew install postgresql -v 稍等片刻,PostgreSQL 就安装完成.接下来就是初始数据库 ...
- Bash远程文件传输命令scp
备份远程文件(远程——>本地) scp -r 远程用户名@ip:文件绝对路径 本地绝对路径 还原远程文件(本地——>远程) scp -r 本地路径 远程用户名@ip:远程绝对路径 如果SS ...
- Orchard路由随记(一)
对于Orchard来说,个人以为要真正理解Orchard,必须理解其路由工作方式. 一.Orchard的自定义路由由三种类型组成 1.分发类: HubRoute:其功能是按租户筛选出当前访问租户的路由 ...
- CSS Pseudo-Element Selectors伪对象选择符
一: CSS3将伪对象选择符(Pseudo-Element Selectors)前面的单个冒号(:)修改为双冒号(::)用以区别伪类选择符(Pseudo-Classes Selectors),但以前的 ...
- 关于Android4.x系统默认显示方向各种修改
1.设置属性值 在device.mk文件中加入PRODUCT_PROPERTY_OVERRIDES += \ ro.sf.hwrotation=180 2.设置屏幕默认显示方向 在frameworks ...