Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59482
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-18 14:49
个人简介

君不见黄河之水天上来!

文章分类
文章存档

2016年(24)

我的朋友

分类: 架构设计与优化

2016-10-09 11:01:36

功能描述
在消息队列上进行收发消息。
为了发送消息,调用进程对消息队列进行写入时必须有写权能。
接收消息时必须有读权能。

用法:
#include
#include
#include
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

参数:
msqid:消息队列的识别码。
msgp: 指向消息缓冲区的指针,
       此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,
       形态如下:
       struct msgbuf {
         long mtype;       /* 消息类型,必须 > 0 */
         char mtext[1];   /* 消息文本 */
       };
msgsz: 消息的大小。
mtype: 消息类型
       mtype等于0 则返回队列的最早的一个消息。
       mtype大于0,则返回其类型为mtype的第一个消息。
       mtype小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。
msgflg:这个参数依然是是控制函数行为的标志,
        取值可以是:
          0,    表示忽略;
          IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。
          如果不指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。
          如果一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。
          如果进程在阻塞等待过程中收到了系统的中断信号,EINTR 就会被返回。
          MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被丢弃了。
          如果不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被取出。

          当消息从队列内取出后,相应的消息就从队列中删除了。


返回说明:
成功执行时,msgsnd()返回0,msgrcv()返回拷贝到mtext数组的实际字节数。
失败两者都返回-1,
errno被设为以下的某个值:
[对于msgsnd]
EACCES: 调用进程在消息队列上没有写权能,同时没有CAP_IPC_OWNER权能
EAGAIN: 由于消息队列的msg_qbytes的限制和msgflg中指定IPC_NOWAIT标志,消息不能被发送
EFAULT: msgp指针指向的内存空间不可访问
EIDRM:  消息队列已被删除
EINTR:  等待消息队列空间可用时被信号中断
EINVAL: 参数无效
ENOMEM: 系统内存不足,无法将msgp指向的消息拷贝进来

[对于msgrcv]
E2BIG: 消息文本长度大于msgsz,并且msgflg中没有指定MSG_NOERROR
EACCES:调用进程没有读权能,同时没具有CAP_IPC_OWNER权能
EAGAIN:消息队列为空,并且msgflg中没有指定IPC_NOWAIT
EFAULT:msgp指向的空间不可访问
EIDRM: 当进程睡眠等待接收消息时,消息已被删除
EINTR: 当进程睡眠等待接收消息时,被信号中断
EINVAL:参数无效
ENOMSG:msgflg中指定了IPC_NOWAIT,同时所请求类型的消息不存在

阅读(2951) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~