功能描述
在消息队列上进行收发消息。
为了发送消息,调用进程对消息队列进行写入时必须有写权能。
接收消息时必须有读权能。
用法:
#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,同时所请求类型的消息不存在
阅读(611) | 评论(0) | 转发(0) |