消息队列的系统限制
作者:冯老师,华清远见嵌入式学院讲师。
消息队列是System V的IPC对象的一种,用于进程间通信,会受到系统的限制,本文主要描述了三个限制。第一:议个消息的最大长度;第二:消息队列的最大容量;第三:最大消息队列数。
一、 一个消息的最大长度
示例程序如下:
#include
#include
#include
#include
#include
#include
#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
#include
#include
#include
#include
#include
#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
#include
#include
#include
#include
#include
#include
#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消息队列通信
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 #include #include #include
Linux 消息队列编程
消息队列.信号量以及共享内存被称作 XSI IPC,它们均来自system V的IPC功能,因此具有许多共性. 键和标识符: 内核中的每一种IPC结构(比如信号量.消息队列.共享内存)都用一个非负整数 ...
linux 消息队列
消息队列,这个可是鼎鼎大名,经常在某些地方看见大家那个膜拜,那个,嗯,那个... 那就给个完整的例子,大家欣赏就行,我一直认为不用那个,嗯@ 这个队列的最大作用就是进程间通信,你要非搞个持久化,那也行 ...
随机推荐
安装vsphere5.1
安装vsphere5.1 安装前的准备(环境) 一台域控制器 一台sql2008数据库 整个环境都是在域环境中的 二.安装vCenter服务 在数据库里创建一个数据库,名字就叫vCenter 1.添加 ...
java视频教程 Java自学视频整理(持续更新中...)
视频教程,马士兵java视频教程,java视频 1.Java基础视频 完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...
fedora25 下配置samba
本例是在 / 目录下建立share 文件夹为例 Sudo dnf install samba samba-common samba-clientsudo mkdir /share sudo chmod ...
Tree Traversals
Tree Traversals 原题链接 常见的二叉树遍历的题目,根据后序遍历和中序遍历求层次遍历. 通过后序遍历和中序遍历建立起一棵二叉树,然后层序遍历一下,主要难点在于树的建立,通过中序遍历和后序 ...
Qt OpenGL三维绘图
简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...
Linux Kernel 'perf_event.c'本地权限提升漏洞
漏洞版本: Linux Kernel 3.11-rc4 漏洞描述: Linux Kernel是一款开源的操作系统 Linux Kernel 'perf_event.c'存在一个安全漏洞,允许本地攻击者 ...
POJ 3422 Kaka&;#39;s Matrix Travels(费用流)
POJ 3422 Kaka's Matrix Travels 题目链接 题意:一个矩阵.从左上角往右下角走k趟,每次走过数字就变成0,而且获得这个数字,要求走完之后,所获得数字之和最大 思路:有点类似 ...
以excel方式输出数据
主类Test: public class D201 {//get set 方法略去 private String d201_01; private String d201_02; private St ...
实现UDP高效接收/响应
环境Linux g++6.3.0 问题一:一个ip地址如何接收高并发请求 问题二:如何高并发响应消息 发送请求端只能通过ip地址+端口号向服务器发送请求码,所以服务器只能用一个UDP去绑定此ip以及端 ...
详解Windows Server 2008 R2下安装Oracle 11g
本篇文章转载 http://www.it165.net/database/html/201212/3385.html 一.安装前的准备工作: 1. 修改计算机名: 服务器的计算机名称对于登录到Orac ...