3.1 概述
消息队列结构:
struct msqid_ds
{
struct ipc_perm msg_perm; //权限结构
struct msg *msg_first; //队列中第一个消息
struct msg *msg_last; //队列中最后一个消息
msglen_t msg_cbytes; //队列中当前消息总字节数
msglen_t msg_qbytes; //队列中最大消息总字节数
msgqnum_t msg_qnum; //队列中当前消息数
pid_t msg_lspid; //最后发送消息进程
pid_t msg_lrpid; //最后接收消息进程
time_t msg_stime; //最后发送时间
time_t msg_rtime; //最后接收时间
time_t msg_ctime; //最后修改时间
};
内核中消息队列结构:
6.2 msgget函数
#include <sys/msg.h>
int msgget(key_t key,int oflag)
oflag:0x0400|0x0200 | 0x0040|0x0020 | 0x0004|0x0002 | IPC_CREAT | IPC_EXCL
创建一个消息队列时:
msg_perm中的uid、gid、cuid、cgid依据调用进程来初始化
msg_perm中的mode依据oflag进行初始化
msg_qnum、msg_lspid、msg_lrpid、msg_stime、msg_rtime置为0
msg_ctime置为当前时间
msg_qbytes设置为系统限制值
6.3 msgsnd函数
#include <sys/msg.h>
int msgsnd(int msqid,void *ptr,size_t len,int flag)
ptr一般是自定义的消息结构
struct mymsg
{
long type;
char text[LEN];
};
len:mymsg结构中类型字段之后的数据长度
falg:IPC_NOWAIT 非阻塞msgsnd(msgsnd不能向队列中写消息时,阻塞还是出错返回的控制位),也可以置为0
6.4 msgrcv函数
#include <sys/msg.h>
ssize_t msgrcv(int msqid,void *ptr,size_t len,long type,int flag)
ptr:接收数据缓冲区
len:缓冲区长度
type:接收的消息类型
0:接收队列中第一个消息
大于0:接收type类型的消息
小于0:接收类型值小于等于|type|的消息中类型值最小的第一个消息
flag:在消息队列中没有指定消息类型时,出错返回还是阻塞
6.5 msgctl函数
#include <sys/msg.h>
int msgctl(int msgid,int cmd,struct msqid_ds *buf)
IPC_STAT:将某个消息队列的信息写到buf中
IPC_SET:按照buf中的mag_perm.uid,msg_perm.gid、msg_perm.mode和msg_qbytes修改消息队列对应项
IPC_RMID:buf忽略,删除消息队列