msgsnd/msgrcv系统调用详解

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

用法:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
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,同时所请求类型的消息不存在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值