消息队列
概念
消息队列特性为先进先出,底层实现是链表,在内核中创建,有一个消息队列的标识符来表示,这个队列当中的每一个元素都有自己的类型,每一个类型都有一个优先级概念
属性
消息队列在操作系统属性
msgmax:每一个节点最大消息的发送字节数为8 k
msgmnb:队列中所有消息的长度之和 为 16 k
msgmni:系统当中最大的队列数为 2 k
图解
使用
创建
int msgget(key_t key, int msgflg)
msgflg:IPC_CREAT
IPC_CREAT | IPC_EXCL
增加消息队列的使用权限,相当于文件的权限
发送
int msgsnd(int msqid, const void* msgq, size_t size, int msgflg)
msgflg:
0:当队列满了,则会阻塞
IPC_NOWAIT:如果队列满了,当前的发送操作不会进行阻塞,函数返回
接收
int msgrcv(int msqid, void* msgq, size_t msgsz, long msgtype, int msgflg)
msgtype:
0:表示什么类型都可以接收
msgtype > 0:则返回队列中消息类型为 msgtype 的第一个消息
msgtype < 0:返回队列中消息类型小于等于msgtype 绝对值的消息,如果这种消息越多,则返回类型最小的消息
销毁
int msgctl(int msqid, int cmd, struct msqid_ds* buf)
cmd:
IPC_STAT
IPC_SET
IPC_RMID
特性
- 生命周期跟随内核,如果不使用命令删除,消息队列一直存在
- 消息队列可以进行双向通信(双工通信)
- 克服了管道的无格式的字节流的缺点