目录
一、定义
1.消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列尾部,接受进程从队列头读取信息。
2.多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列的尾部,接收进程从消息队列头部读取信息,信息一旦被读出就从队列中删除。
二、结构
struct msgbuf
{
long mtype;//消息类型
char mtext[128];//消息的数据
}
三、消息队列的创建
1.在UNIX中,采用msgget函数创建消息队列;
(1)函数原型:
int msgget(key_t key,int msgflg);
(2)参数:
key:消息队列的关键字
key_t key = ftok(把一个已存在的路径名和一个整数标识符转换成IPC键值);
参数msgflg的低九位指定队列的属主、属组和其他用户的访问权限,其他位指定消息队列的创建方式;
创建方式参数:
IPC_CREAT: 创建,如存在则打开;
IPC_EXCL: 与IPC_CREAT使用,单独使用无意义,创建时,如存在则失败;
(3)相关示例:
例1.创建关键字位0x1234,访问权限位0666的消息队列,如队列已经存在返回其标识号。
int msgid;
msgid = msgget(0x1234,0666|IPC_CREAT);
例2.创建关键字位0x1234,访问权限位0666的消息队列,如队列已经存在则报错。
int msgid;
msgid = msgget(0x1234,0666|IPC_CREAT|IPC_EXCL);
四、消息队列的发送与接收
1.函数msgsnd向消息队列发送消息
(1)函数原型:
int msgsnd(int msqid,void *msqp,int msgsz,int msgflg);
(2)参数
msgid:发送消息队列的标识号;
msgp:指向存储待发送消息内容的内存地址;
msgsz:指定长度,仅记载数据的长度;
msgflg:控制消息发送的方式,有阻塞和非阻塞两种方式;非阻塞 IPC_NOWAIT
2.函数msgrcv向消息队列接收消息
(1)函数原型:
int msgrcv(int msqid,void *msqp,int msgsz,long msgtyp,int msgflg);
(2)参数
msgid:发送消息队列的标识号;
msgp:指向存储待发送消息内容的内存地址;
msgsz:指定长度,仅记载数据的长度;
msgtyp:指定读取消息的类型;
{0:读取消息队列中的第一个消息;
正整数:读取消息队列中第一个类型为msgtyp的消息;
负整数:读取消息队列中第一个类型小于或等于msgtyp的绝对值的消息;
}
msgflg:控制消息发送的方式,有阻塞和非阻塞两种方式;
非阻塞 IPC_NOWAIT
截断方MSG_NOERROR
3.消息队列用完之后从内核中移除
(1)函数原型:
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
(2)参数
IPC_RMID:消息队列链表从内核中移除
这里的具体参数查找man手册