消息队列
来源:互联网 发布:网络销售人员业务流程 编辑:程序博客网 时间:2024/06/06 00:32
3种IPC机制:信号量、共享内存、消息队列。
信号量:用于管理队资源的访问;
共享内存:用于程序之间高效的共享数据;
消息队列:在进程之间传递数据的一种简单方法。
前两种已经做过介绍,这里介绍一下消息队列。
1. intmsgget(key_t key, int msgflg); //创建消息队列
参数:
key:消息队列关联的键。
msgflg:消息队列的建立标志和存取权限。
返回说明:
成功执行时,返回消息队列标识值。失败返回-1,errno被设为以下的某个值
EACCES:指定的消息队列已存在,但调用进程没有权限访问它,而且不拥有CAP_IPC_OWNER权能
EEXIST:key指定的消息队列已存在,而msgflg中同时指定IPC_CREAT和IPC_EXCL标志
ENOENT:key指定的消息队列不存在同时msgflg中不指定IPC_CREAT标志
ENOMEM:需要建立消息队列,但内存不足
ENOSPC:需要建立消息队列,但已达到系统的限
2. int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); //将消息送入消息队列
参数:
msqid:消息队列的识别码。
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构下
struct msgbuf {
long mtype; /* 消息类型,必须> 0 */
char mtext[1]; /* 消息文本*/
};
msgsz:消息的大小。
msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。
msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为ENOMSG。当msgflg为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式。
返回说明:成功执行时,msgsnd()返回0, 失败返回-1
3. intmsgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
//从消息队列读取信息.
参数和msgsnd类似。
成功执行时,返回0, 失败返回-1
4. msgctl(msqid,IPC_RMID, NULL) //删除消息队列
创建消息队列时有时会出现:No space left on device 的错误,这时,可以通过修改MSGMNI这个参数来解决。MSGMNI--- 这个参数决定了系统中同时运行的最大的message queue的个数。
MSGMNI:/proc/sys/kernel/msgmni文件中定义了该值;
作用:该值定义了消息队列的最大长度;要使db2(7.1版)正常运行,其最小值为128;
对于高负荷的DB2服务器,可将该值调整为 >= 1024;
调谐:对于2.4.6版本的内核,其缺省值为16;可用以下三中方法改变该值
(1) bash#sysctl -w kernel.msgmni=128
(2) bash#sysctl -w kernel.msgmni=128
(3) 如果要在系统启动时改变该值,可在/etc/sysctl.conf文件中加入以下几句:
# Sets maximum number of messagequeues to 128
# Set this to 1024 or higher on productionsystems
kernel.msgmni = 128
(用ipcs -l 命令来查看当前ipc 参数的各种设置)
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- <>消息队列
- 消息队列
- 数组调整
- 【iOS开发】---- appledoc:Objective-C注释文档生成工具
- SQL Server 2008编程入门经典笔记(第三章:T-SQL基本语句)
- hdu 1394 zoj 1484 求旋转序列的逆序数(并归排序)
- Jellybean上relro引起的 SEGV_ACCERR段错误问题
- 消息队列
- WCF建证书步骤
- CentOS卸载apache php mysql
- NGUI学习笔记
- 判断俩链表是否相交
- System.InvalidOperationException: 线程间操作无效: 从不是创建控件“labelControl1”的线程访问它
- 全面整理C#和Java的异同
- 一步步搭建ubuntu server console(控制台,字符模式)开发环境
- 安卓-API GUIDES--Linear Layout