进程间通信之消息队列

函数原型

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:消息的大小。

msgtyp:消息类型

msgtyp等于0 则返回队列的最早的一个消息。

msgtyp大于0,则返回其类型为msgtyp的第一个消息。

msgtyp小于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,同时所请求类型的消息不存在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值