消息队列由消息队列id来唯一标识
消息队列就是一个消息的列表 用户可以在消息队列中添加消息 读取消息
消息队列可以按照类型来发送和接收消息
消息队列使用步骤
打开/创建消息队列 msgget
向消息队列发送消息 msgsnd
从消息队列接收消息 msgrcv
控制消息队列 msgctl
创建/打开消息队列
#include <sys/ipc.h>
#include <sys/msg.h>n
int msgget(key_t key, int msgflg)
成功返回消息队列的id 失败返回EOF
key 和消息队列关联的key IPC_PRIVATE(私有的)或ftok(如果想共享这个消息队列 通过这个函数创建key)
msgflg 标志位 IPC_CREAT|0666
消息发送
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msgid, const void *msgp, size_t size,int msgflg)
成功返回0 失败返回-1
msgid 消息队列id
msgp 消息缓冲区地址
size 消息正文长度
msgflg 标志位 0(阻塞, 直到空间足够 发送成功,,函数返回0)或IPC_NOWAIT(不会阻塞, 让函数-1 )
消息格式
通信双方首先定义好统一的消息格式
用户根据应用需求定义结构体类型
首成员类型为long, 代表消息类型(正整数)
其他成员都属于消息正文
消息接收
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int msgflg)
成功返回消息队列长度 失败返回-1
msgid 消息队列id
msgp 消息队列缓冲区地址
size 指定接收的消息长度
msgtype 指定接收的消息类型 如果为0 表示接收消息队列中最早的消息
如果为负数 是按照优先级接收
msgflg 标志位 0(如果无消息 ,阻塞 直到有消息 或信号打断 或消息队列被删除)或IPC_NOWAIT
(如果没有消息 返回一个错误)
控制消息队列
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msgid, int cmd, struct msqid_ds *buf)
成功返回 0 失败返回-1
msgid 消息队列id
cmd 要执行的操作
IPC_STAT :获取消息队列的属性
IPC_SET :设置消息队列的属性
IPC_RMID 删除消息队列的属性(不需要第三个参数, 执行这个后 立马执行
不论有没有消息在发送或接受
buf 存放消息队列属性的地址