您的位置:首页 > 其它

IPC---消息队列

2016-07-16 23:12 197 查看
消息队列简介
每种通信方式的实现和功能都不一样,带来的场景也不同,消息队列是链表,它通过内核提供一个
struct msqid_ds *msgque[MSGMNI]向量维护一个消息队列列表,因为linux系统支持的最大消息对列数由msgque数组决定,每个msgid_ds表示一个消息队列;
1.一个消息队列的结构:
struct msqid_ds中数据成员介绍如下:
{ struct ipc_perm msg_perm; struct msg *msg_first; /*消息队列头指针*/ struct msg *msg_last; /*消息队列尾指针*/ __kernel_time_t msg_stime; /*最后一次插入消息队列消息的时间*/ __kernel_time_t msg_rtime; /*最后一次接收消息即删除队列中一个消息的时间*/ __kernel_time_t msg_ctime; struct wait_queue *wwait; /*发送消息等待进程队列*/ struct wait_queue *rwait; unsigned short msg_cbytes; unsigned short msg_qnum; /*消息队列中的消息个数*/ unsigned short msg_qbytes; __kernel_ipc_pid_t msg_lspid; /*最后一次消息发送进程的pid*/ __kernel_ipc_pid_t msg_lrpid; /*最后一次消息发送进程的pid*/};

2.消息队列的使用

(1)消息队列key的获取
在程序中若要使用消息队列,必须要能直到消息队列key,因为进程无法直接访问内核消息队列结构,因此需要一个消息队列的标示,让进程知道当前操作的是哪个消息队列,同时也要保证消息队列的key值唯一性。
key_t kkey=ftok(".","a");
该函数通过一个路径名映射出一个消息队列key
(2)获取或打开一个消息队列
qid=msgget(key_t key,int msgflag);
key:消息队列Key
-msgflag:
IPC_PRIVATE:创建一个 该进程独占的消息队列,其他进程不能访问该消息队列
IPC_CREAT:若消息队列不存在则创建一个新的消息队列,若消息队列存在,则返回消息队列
IPC_CREAT|IPC_EXCL::保证只创建新的队列,若消息队列存在 则返回错误
IPC_NOEAIT:小队列以非阻塞方式获取
函数原因:
1)如果key==IPC_PRIVATE则申请一块内存,创建一个新的消息队列
2)在msgque向量表中找键值为key的消息队列,如果没有找到结果有两种情况:
msgflag表示不创建新的消息队列则返回错误
msgflag表示要创建新的消息队列(IPC_CREAT)则创建新的消息队列
3.发送一个消息队列
int msgsnd(int msqid,struct msgbuf* msgp,size_t msgsz,int msgflg)
--msqid:为消息队列的qid
--msgp:为对应消息内容结构体指针
--msgsz:消息的大小即指针指向的消息结构体大小
--msflg:消息标志
0:忽略该标志位,以阻塞的方式发送消息到消息队列
4,从消息队列接受一个消息到msgbuf*
int msgrcv(int msqid,struct msgbuf* msgp,size)t msgsz,long msgtyp,int msgflg)
--msgqid:消息队列的qid
--msgp:是接受到的消息队列将要存放的缓冲区
--msgsz:消息的大小
--msgtyp:期望接受到的消息的类型
--msgflg:标志
5.消息队列的控制
int msgctl(int msqid,int cmd,struct msqid_ds* buf)
--msqid:为消息队列的qid
--cmd:为该函数要对消息队列执行的操作
IPC_ATAT:取出消息队列的msqid_ds结果体并将参数存入buf所指向的msqid_ds结构体对象中
IPC_SET:设定消息队列的msqid_ds数据中的msg_perm成员,设定值由Buf指向的msqid_ds结构给出。
对消息队列进行相关设置以及操作具体由cmd决定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IPC 消息队列