1. 消息队列就是一个消息的链表。可以把消息看做一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新信息,对消息队列有读权限的进程可以从消息队列中读走消息,消息队列是随内核持续的。每个消息队列都有一个队列头,用结构struct msg_queue来描述。队列头中包含了该消息队列的大量信息,包括消息队列键值,用户ID,组ID,消息队列中消息数目等,甚至记录了最近对消息队列读写进程的ID。读者可以访问这些信息,也可以设置其中的某些信息。
2. 全局数据结构struct ipc_ids msg_ids可以访问到每个消息队列头的第一个成员struct kern_ipc_perm能够与具体的消息队列对应起来是因为在该结构中,有一个key_t类型成员key,而key则确定一个消息队列。
3. 消息队列的操作有以下三种类型
a. 打开或者创建消息队列b. 读写操作
c. 获得或者设置消息队列属性
4.键值的概念:消息队列的内核持续性要求每个消息队列在系统范围内都有对应的唯一的键值,要获得一个消息队列的描述字,必须提供该消息队列的键值
5.ftok函数:
作用:将文件名转化为键值
函数原型:key_t fotk(char *pathname ,char proj)
返回值:返回与文件对应的键值
6.msgget函数
作用:创建消息队列
原型:int msgget(key_t key,int msgflg)
参数:键值和权限,是可读还是可写,IPC_PRIVATE,设定一个数字,也可以由tok函数获得
msgflg:IPC_CREAT:无消息队列时创建消息队列
IPC_EXCL:只有在消息队列不存在时创建消息队列,否则报错
IPC_NOWAIT:读写消息队列无法得到满足时不等待,之间返
返回值:执行成功时,返回与键值key对应的消息队列描述字;执行出错,返回-1
7.msgrcv函数
函数的原型:int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg);
头文件:#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
参数:
msqid:消息队列的ID(描述字)
msgp:消息读取后存放的内存空间首地址,是消息结构类型的指针
msgsz:消息数据的长度
msgtyp:请求读取的消息类型(正整数)
msgflg:接收标志
IPC_NOWAIT:读不到数据时直接返回,不等待
0:一直等待到成功读取数据
返回值:执行成功,返回0;执行出错,返回-1
8.msgsnd函数
函数的原型:int msgsnd(int msqid, struct msgbuf *msgp, int msgsz,int msgflg);
头文件:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
参数:
① msqid:已打开的消息队列ID(描述字)
② msgp:指向消息结构的指针,结构如下:
struct msgbuf
{
long mtype; //消息类型,大于0
char mtext[1]; //消息数据的首地址
};
③ msgsz:消息数据的长度
④ msgflg:发送标志
IPC_NOWAIT:写不进数据时直接返回,不等待
0:一直等待到成功写入数据
返回值:执行成功,返回0;执行出错,返回-1
(4)控制消息队列
通常在使用完消息队列后用msgctl函数删除消息队列
函数的原型:int msgctl(int msqid, int cmd, struct msqid_ds *buf);
头文件:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
参数:
① msqid:消息队列的ID(描述字)
② cmd:相应的命令
IPC_STAT:获取消息队列信息,返回信息存在buf指向的msqid结构中
IPC_SET:设置消息队列的属性
IPC_RMID:删除消息队列
③ buf:消息队列的结构类型变量
返回值:执行成功,返回0;执行出错,返回-1
例:
读取函数:
本文详细介绍了消息队列的基本概念、工作原理及核心API,包括创建、读写消息队列的操作,以及通过示例展示了如何使用消息队列进行进程间通信。
551

被折叠的 条评论
为什么被折叠?



