Linux学习笔记--IPC中的消息队列【0608】

时间:2021-07-14 17:03:45
 

接收部分的代码

//大部分其实都是类似的,

 

Linux学习笔记--IPC中的消息队列【0608】Linux学习笔记--IPC中的消息队列【0608】Code

 

 

消息队列的结构

 

 

//这一块因为排版的问题,取消了部分文字。。。。 

排版总是有问题,放在code里也不行,大致是ipc_id指针指向ipc_id[n]再通过kern_ipc_perm*指向msg_queue中的kern_ipc_perm

上面的是从网上找到的关于这一部分结构的讲解,有助于这一部分的理解

 

但我在查看了linux内核源码之后发现还是有些出入,可能是因为版本的问题

 

struct ipc_ids {

       int in_use;

       unsigned short seq;

       unsigned short seq_max;

       struct rw_semaphore rw_mutex;

       struct idr ipcs_idr;

};

 

ipc_id的结构未能找到.

 

struct msg_queue {

       struct kern_ipc_perm q_perm;

       time_t q_stime;                   /* last msgsnd time */

       time_t q_rtime;                   /* last msgrcv time */

       time_t q_ctime;                   /* last change time */

       unsigned long q_cbytes;             /* current number of bytes on queue */

       unsigned long q_qnum;        /* number of messages in queue */

       unsigned long q_qbytes;             /* max number of bytes on queue */

       pid_t q_lspid;                     /* pid of last msgsnd */

       pid_t q_lrpid;               /* last receive pid */

 

       struct list_head q_messages;

       //struct list_head linux内核实现的双向链表结构,已经实现了一定的操作

       struct list_head q_receivers;

       struct list_head q_senders;

       //这里面用三个双链表来记录消息的本身,发送者和接收者

};

struct kern_ipc_perm

{

       spinlock_t      lock;

       int           deleted;

       int           id;

       key_t             key;

       uid_t              uid;

       gid_t              gid;

       uid_t              cuid;

       gid_t              cgid;

       mode_t          mode;

       unsigned long seq;

       void        *security;

};

 

消息队列的操作

1 打开(获取)或创建消息队列

2 读写操作

3 获得或设置消息队列属性

具体对应如下API(只列出常用的)

1int msgget(key_t key, int msgflg)     -->获取或创建

2int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);

                                                                -->消息的接收(截获)

3int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);

                                                                -->消息的发送

4int msgctl(int msqid, int cmd, struct msqid_ds *buf);

                                                                -->消息的控制(状态获取,属性设置,队列的销毁)

具体怎么用不在这里列出,可以参考前面的程序和manpages

另外在使用消息队列时,要通过一结构体告知系统其具体的类型

这一步是需要自己定义的,

struct msgbuf{

long mtype;    //消息的类型

char mtext[1]; //消息的内容

};

当然也可以使用单独的变量.

最后,再转一段网上搜来的代码,

虽然丰富了些,但个人感觉,就学习理解而言不如前面的代码

 

Linux学习笔记--IPC中的消息队列【0608】Linux学习笔记--IPC中的消息队列【0608】Code