消息队列

发布时间:2016-12-8 0:26:24 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"消息队列",主要涉及到消息队列方面的内容,对于消息队列感兴趣的同学可以参考一下。

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 参数的各种设置)

上一篇:hdu 1394 zoj 1484 求旋转序列的逆序数(并归排序)
下一篇:[29期] [总结]LINUX常用的目录

相关文章

关键词: 消息队列

相关评论