消息队列

来源:互联网 发布:网络销售人员业务流程 编辑:程序博客网 时间: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 参数的各种设置)

原创粉丝点击