1消息队列是消息的链表,存放在内存中,由内核维护
2消息队列的特点:
-1,消息队列中的消息是有类型的
-2,消息队列中的消息是有格式的
-3,消息队列可以实现消息的随机查询.消息不一定要以先进先出的次序读取,编程时可以
按照消息的类型读取
-4,消息队列允许一个或多个进程向它写入或者读取消息.
3与无名管道命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除
4每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的.
5只有内核重启或者人工删除消息队列时,该消息队列才会被删除.若不人工删除消息队
列,它会一直存在于系统中.
消息队列提供了⼀个从⼀个进程向另外⼀个进程发送⼀块数据的⽅法
每个数据块都被认为是有⼀个类型,接收者进程接收的数据块可以有不同的类型值
消息队列也有管道⼀样的不⾜,就是每个消息的最⼤⻓度是有上限的(MSGMAX),
每个消息队
列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有⼀个上限(MSGMNI)
Sytem v提供的IPC通信机制需要一个key值,通过key值就可以在系统内获得一个唯一的消息队列标识符
Key值可以是认为指定的,也可以通过ftok函数来获得.
Ftok函数 | |
包含头文件 | #include<sys/types.h> #include<sys/ipc.h> |
函数原型 | Key_t ftok(const char* pathname,int proj_id) |
功能 | 获得项目相关的唯一的IPC键值 |
函数传入值 | Pathname:路径名 |
proj_id:项目id,非零整数(只有低八位有效) | |
函数返回值 | 成功返回key值 失败返回-1 |
创建消息队列
Msgget函数 | |
包含头文件 | #include<sys/msg.h> |
函数原型 | Int msgget(ket_t key,int msgflg) |
功能 | 创建一个新的或者打开一个已经存在的消息队列.不同的进程调用此函数,只要用相同的key值就能得到同一消息队列的标识符 |
函数传入值 | Key:IPC键值 |
Msgflag:标识函数的行为及消息队列的权限 | |
函数返回值 | 成功返回⼀个⾮负整数,即该消息队列的标识码; 失败返回-1 |
消息队列的控制
Msgctl函数 | |
包含头文件 | #include<sys/msg.h> |
函数原型 | int msgctl(int msqid, int cmd, struct msqid_ds *buf); |
功能 | 对消息队列进行各种控制,如修改消息队列的属性.或删除消息队列 |
函数传入值 | msqid: 由msgget函数返回的消息队列标识码 |
cmd:是将要采取的动作,(有三个可取值) | |
Buf:msqid_ds数据类型的地址,用来存放或更改消息队列的属性 | |
函数返回值 | 成功返回0,失败返回-1 |
cmd
IPC_RMID:删除由msqid指示的消息队列,将它从系统中删除并破坏相关的数据结构
IPC_STAT:将msqid_ds结构中各个元素的当前值存入到由buf指向的结构中.
IPC_SET:将msqid_ds结构中的元素设置为由buf指向的结构中的对应值.
发送消息
Msgsnd函数 | |
包含头文件 | #include<sys/msg.h> |
函数原型 | int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg) |
功能 | 将新消息添加到消息队列 |
函数传入值 | msgid: 由msgget函数返回的消息队列标识码 |
msgp:是⼀个指针,指针指向准备发送的消息, | |
msgsz:是msgp指向的消息⻓度,这个⻓度不含保存消息类型的那个long int⻓整型 | |
msgflg:函数的控制属性0:控制着当前消息队列满或到达系统上限时将要发⽣的事情 msgflg=IPC_NOWAIT表⽰队列满不等待,返回EAGAIN错误。 | |
函数返回值 | 成功返回0; 失败返回-1 |