消息队列
一、消息队列
1. 消息队列是消息的链表,存放在内存中,由内核维护
2. 特点
1)消息队列允许一个或多个进程向它写入或者读取消息,并且每条消息都有类型
2)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。
3)与无名管道、有名管道一样,从消息队列中读出消息,消息队列中数据会被删除。
4)消息队列中的消息是有格式的。
5)只有内核重启或人工删除时,该消息才会被删除,若不人工删除消息队列,消息队列会一直存在于内存中
6)消息队列标识符,来标识消息队列。消息队列在整个系统中是唯一的。
7)在Linux操作系统中消息队列限制值如下:
消息队列个数最多为16个
消息队列总容量最多为16384字节
每个消息内容最多为8192字节
3. System V提供的IPC通信机制需要一个key值,通过key值就可在系统内获得一 个唯一的消息队列ID。
4. key值可以是人为指定的,如(key_t)1234;也可以通过ftok函数获得,如。
5. ftok函数
#include
#include
key_t ftok(const char *pathname, int proj_id);
功能:
获得项目相关的唯一的IPC键值。
参数:
pathname:路径名
proj_id:项目ID,非0整数(只有低8位有效)
返回值:
成功返回key值
失败返回 -1。
6.消息队列的消息的格式。
typedef struct _msg
{
long mtype; /*消息类型*/
char mtext[100];/*消息正文*/
... /*消息的正文可以有多个成员*/
}MSG;
消息类型必须是长整型的,而且必须是结构体类型的第一个成员,类型下面是消息正文,正文可以有多个成员(正文成员可以是任意数据类型的)。
7.使用shell命令操作消息队列:
查看消息队列 ipcs -q
删除消息队列 ipcrm -qmsqid
8.创建消息队列:
#include
int msgget(key_t key, int msgflg);
功能:
创建一个新的或打开一个已经存在的消息队列。
不同的进程调用此函数,只要用相同的key值就能得到,
同一个消息队列的ID。
参数:
key:IPC键值
msgflg:标识函数的行为:
IPC_CREAT(创建)或
IPC_EXCL(如果已经存在则返回失败)。
返回值:
成功:消息队列的标识符
失败:返回-1。
9.发送消息:
#include
int msgsnd(int msqid, const void *msgp,size_t msgsz,int msgflg);
功能:
将新消息添加到消息队列。
参数:
msqid:消息队列的队列ID。
msgp:待发送消息结构体的地址。
msgsz:消息正文的字节数。
msgflg:函数的控制属性
0:msgsnd调用阻塞直到条件满足为止。
IPC_NOWAIT:若消息没有立即发送则调用该函数的进程会立即返回。
返回值:
成功:0
失败:返回-1。
10.接收消息:
#include
ssize_t msgrcv(int msqid, void *msgp,size_tmsgsz,long msgtyp, int msgflg);
功能:
从ID为msqid的消息队列中接收一个消息。一旦接收消息成功,则消息在消息队列中被删除。
参数:
msqid:消息队列的ID,代表要从哪个消息列中获取消息。
msgp:存放消息结构体的地址。
msgsz:消息正文的字节数。
msgtyp:消息的类型、可以有以下几种类型
msgtyp= 0:返回队列中的第一个消息
msgtyp > 0:返回队列中消息类型为msgtyp的消息
msgtyp< 0:返回队列中消息类型值小于或等于msgtyp绝对值的消息,如果这种消息有若干个,则取类型值最小的消息
msgflg:函数的控制属性
0:msgrcv调用阻塞直到接收消息成功为止。
MSG_NOERROR:若返回的消息字节数比nbytes字节数多,则消息就会截短到nbytes字节,且不通知消息发送进程。
IPC_NOWAIT:调用进程会立即返回。若没有收到消息则立即返回-1。
注意:
若消息队列中有多种类型的消息,msgrcv获取消息的时候按消息类型获取,不是先进先出的。
在获取某类型消息的时,若队列中有多条此类型的消息,则获取最先添加的消息,即先进先出原则
返回值:
成功返回读取消息的长度
失败返回-1。
11.消息队列的控制
#include
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:
对消息队列进行各种控制,如修改消息队列的属性,或删除消息消息队列。
参数:
msqid:消息队列的ID
cmd:函数功能的控制
IPC_RMID:删除由msqid指示的消息队列,将它从系统中删除并破坏相关数据结构。
IPC_STAT:将msqid相关的数据结构中各个元素的当前值存入到由buf指向的结构中。
IPC_SET:将msqid相关的数据结构中的元素设置为由buf指向的结构中的对应值。
buf:msqid_ds数据类型的地址,用来存放或更改消息队列的属性。
返回值:
成功:返回0;
失败:返回 -1
12.消息队列实现进程间通信:消息队列实现两个不相干进程通信