消息:可以简单理解为类型+数据
消息类型需大于等于1,0代表着不区分消息类型,也可以认为是任何类型
struct mess
{
long int type;//>=1
...//存储的数据
}
消息队列在同一类型上的消息传递符合先进先出的规定,对于整个消息队列而言,类优先级队列
引用头文件#include <sys/msg.h>
消息队列的使用:
创建:
int msgget( ket_t )key , int flag);
返回值为内核对象的标识符,即所创建的消息队列的标识符,创建失败返回-1
flag标志位,这里一般给出 IPC_CREAT | 权限 ,例如:IPC_CREAT|0600
发送消息:
int msgsnd( int msgid , void*ptr , int datalen , int flag );
msgid:内核对象的标识符,即msgget返回值,ptr指向结构体消息,指向的消息数据类型包含一个long int的类型字段,以及数据字段。datalen:数据部分的有效长度,flag:标志位,此处我们一般默认给0。
接收消息:
int msgrcv( int msgid , void* ptr , int size , long type , int flag );
size:消息数据部分的有效长度,type:想要接受的消息的消息类型,flag:标志位,此处我们一般默认给0。
删除内核对象消息队列的IPC结构,即释放资源,使用下面设置属性函数
设置属性:int msgctl( int msgid , int cmd , struct msgid_ds*buff );
cmd:命令,删除是IPC_RMID,struct msgid_ds*buff我们一般默认给0。
阻塞:若消息队列放满消息,则发送端msgsnd()会阻塞,消息队列为空,则msgrcv()会阻塞。
发送与获取消息时,必须指定消息类型,值一般>=1,0不区分消息类型或可理解为表示所有消息类型
Linux终端命令行操作命令:
ipcs -q 查看消息队列
ipcs -q msgid 删除消息队列
代码如下