消息队列
*消息队列是内核地址空间中的内部链表,通过内核在各个进程之间传递的内容。消息顺序发送到消息队列中,每个消息队列都有IPC标识符唯一地进行标识。
msgbuf结构
struct msgbuf{
long mtype; //消息类型
char mtext[1]; //消息数据
};
msgid_ds结构
struct msqid_ds{
struct ipc_perm msg_perm;
time_t msg_stime; //发送到队列的最后一个消息的时间戳
time_t msg_rtime; //从队列中获取的最后一个消息的时间戳
time_t msg_ctime; //对队列进行最后一次变动的时间戳
unsigned long __msg_cbytes; //在队列上所驻留的字节总数
msgqnum_t msg_qnum; //当前处于队列中的消息数目
msglen_t msg_qbytes; //队列中能容纳的字节的最大数目
pid_t msg_lspid //发送最后一个消息进程的PID
pid_t msg_lrpid //接收最后一个消息进程的PID
};
ipc_perm结构
struct ipc_perm{
key_t key; //函数msget()使用的键值
uid_t uid; //用户的UID
gid_t gid; //用户的GID
uid_t cuid; //建立者的UID
gid_t cgid; //建立者的GID
unsigned short mode; //权限
unsigned short seq; //序列号
};
键值构建ftok()函数
#include<sys/types.h>
#include<sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
//pathname必须是已经存在的目录
获得消息msgget()函数
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgget(key_t key, int msgflg);
/*第一个参数可以用ftok()函数生成
msgflg参数:
1.IPC_CREAT 如果内核中不存在该消息队列,则创建它
2.IPC_EXCL 当和IPC_CREAT一起使用时,如果队列早已存在则将出错
*/
发送消息msgsend()函数
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgsend(int msqid, const void *msgp, size_t msgsz, int msgflg);
/*
第一个参数从msgget()获得
第二个参数指向一个消息缓冲区
第三个参数消息的大小,以字节为单位,不包括消息类型的长度(4字节)
第四个参数设置成0表示忽略,设置成IPC_NOWAIT,如果消息队列已经满了,则消息不写进队列中,如果不设置则阻塞直到可以写消息为止
*/
接收消息msgrcv()函数
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
/*
第一个参数从msgget()获得
第二个参数消息缓冲变量的地址
第三个参数消息的大小,以字节为单位,不包括消息类型的长度(4字节)
第四个参数指定要从队列中获取的消息类型,内核查找队列中匹配类型的第一个到达的消息,如果传0则返回队列最早的消息,不管类型
第五个参数设置成IPC_NOWAIT,如果消息队列没有消息则返回ENOMSG,否则进程将阻塞直到满足条件的消息到达,如果客户等待消息的时候队列被删除则返回EIDRM,如果进程阻塞并等待消息的时候捕获信号则返回EINTR
*/