消息队列:
消息队列是消息的链表,存储在内核,由消息队列标识符标识,
消息队列的功能
只想说说函数的 ,但是考虑理工男是什么?为什么?所以在这引入一个博客,非常详细 主要说功能
异步、解耦、削峰等
优缺点:
linux函数实现
int msgget(key_t key, int flag)
- 用于创建一个或者打开一个现有的队列
- key 为一个IPC的键 ,可用 key_t ftok(const char * path,int id)生成
- flag IPC_CREAT 打开或创建 IPC_EXCL 队列存在则报错 可用 | 连接使用
int msgctl (int msqid, int cmd, struct msqid_ds *buf)
- msqid 为创建的消息队列的标识符
- cmd为指令参数
- TPC_STAT 获取本队列的信息结构体存到buf中
- TPC_SET 设置消息队列的基本属性,将buf中的设置拷贝过来
- IPC_RMID 删除消息队列
- buf 为消息队列信息结构体 包括
- 权限、
- 队列消息数、
- 队列最大字节数、
- 最后一条消息的发送者、
- 最近一次消息接收者pid
- 等等
int msgsnd (int msqid, const void * ptr,size_t nbytes,int flag)
- 用于发送一个消息到消息队列
- 消息由 三部分组成
- 一个正的长整形类的字段、一个非负数的长度、实际的数据字节数
- 消息
- const void * ptr 为一个结构体指针 结构体中包括
- 类型的字节数字(字段)
- 实际存储的数据
- nbytes 为数据的字节数
- flag 为发送时的属性
- 默认为等待(如果消息队列满了的话就阻塞等待)
- IPC_NOWAIT不等待满了出错
ssize_t msgrcv (int msqid,void * ptr, size_t nbytes,long type, int flag)
- 接收消息队列的消息
- ptr nbytes flag 和 msgsnd() 的一样
- long type 是选择接收的设置参数
- == 0 返回队列第一个值
- > 0 返回队列中类型为type 的第一个消息
- < 0 返回消息队列中小于type绝对值的消息,如果有多个就的返回类型最小的一个