> 文章列表 > day15 消息队列

day15 消息队列

day15 消息队列

目录

消息队列

 消息队列的使用

发送消息

消息的接收

消息队列的控制


消息队列

概念:

消息队列是system V IPC对象的一种;

消息队列有消息队列ID来唯一标识;

消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等;

消息队列可以按照类型来发送/接收消息

内核过程(链表):

 消息队列的使用

发送端:

1、申请 key;

2、打开 / 创建消息队列  msgget

3、向消息队列发信息  msgand

接收端:

1、打开 / 创建消息队列  msgget

2、从消息队列接收信息  msgrcv

3、控制(删除)消息队列  msgctl

打开 / 创建消息队列:

#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);

成功时返回消息队列的ID,失败返回EOF

key :和消息队列关联的key ,IPC_PRIVATE 或 ftok

msgflg :标志位 IPC_CREAT | 0666  , IPC_CREAT:  没有则创建,有则打开。

发送消息

#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msgid, const void *msgp, size_t size, int msgflg);

成功时返回0,失败时返回-1;

参数:

msgid :消息队列id;

msgp :消息缓冲区地址;

size:消息正文长度;

msgflg:标志位 0 或 IPC_NOWAIT;

msgflg :

                  0:当消息队列满时,msgsnd会阻塞,知道消息能写进消息队列

IPC_NOWAT:  当消息队列已满时,msgsnd函数不等待。立即返回

消息格式:

typedef struct {long msg_type;char buf[128];
}msgT;

注意:

1、消息结构必须有long类型的msg_type字段,表示消息的类型;

2、消息长度不包括首类型long;

消息的接收

#include <sys/ipc.h>#include <sys/msg.h>int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int msgflg);

成功时返回收到的消息长度,失败时返回-1

参数:

  msgid :消息队列id

  msgp : 消息缓冲区地址

  size :指定接收的消息长度

  msgflg :标志位 

  msgtype :指定接收的消息类型  

  msgtype:

                msgtype=0:收到的第一条消息,任意类型。

                msgtype>0:收到的第一条 msg_type类型的消息。

                msgtype<0:接收类型等于或者小于msgtype绝对值的第一个消息。

例子:如果msgtype=-4,只接受类型是1、2、3、4的消息

msgflg:

                0:阻塞式接收消息

                IPC_NOWAIT:如果没有返回条件的消息调用立即返回,此时错误码为ENOMSG

                MSG_EXCEPT:与msgtype配合使用返回队列中第一个类型不为msgtype的消息

消息队列的控制

删除消息

#include <sys/ipc.h>#include <sys/msg.h>int msgctl(int msgid, int cmd, struct msqid_ds *buf);

  成功时返回0,失败时返回-1

参数:

  msgid :消息队列id

  cmd : 要执行的操作  IPC_STAT / IPC_SET / IPC_RMID(删除)

  buf: 存放消息队列属性的地址