码迷,mamicode.com
首页 > 其他好文 > 详细

IPC---消息队列

时间:2016-07-17 02:22:00      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:ipc---消息队列

消息队列简介

    每种通信方式的实现和功能都不一样,带来的场景也不同,消息队列是链表,它通过内核提供一个

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---消息队列

标签:ipc---消息队列

原文地址:http://10808695.blog.51cto.com/10798695/1827050

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!