消息队列
消息队列提供了一个从一个进程向另一个进程发送一块数据的方法。
每个数据块都被认为是有一个类型,接收进程接收的数据块可以有不同的类型值。
消息队列也有管道一样的不足,每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)
cat /proc/sys/kernel/msgmax #查看
IPC对象数据结构
内核为每个IPC对象维护一个数据结构
struct ipc_perm{
key_t _key;
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t cgid;
unsigned short mode;
unsigned short _seq;
};
消息队列结构
struct msqid_ds
{
struct ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
unsigned long _msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
};
消息队列在内核中的表示
消息队列函数
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgget(key_t key,int msgflg);
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
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);
功能:用来创建和访问一个消息队列
原型
int msgget(key_t key,int msgflg);
参数
key:某个消息队列的名字
msgflg:由九个权限标志构成,
返回值:成功返回一个非负整数,即该消息队列的标识码;失败返回-1
功能:消息队列的控制函数
原型
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
参数:
msgid:由msgget函数返回的消息队列标识码
cmd:是将要采取的动作
返回值:成功返回0,失败返回-1