System V IPC之消息队列

消息队列由消息队列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

System V IPC之消息队列

                                            消息发送

 

#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, 代表消息类型(正整数)

 

其他成员都属于消息正文

System V IPC之消息队列

                                     消息接收

 

#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

(如果没有消息 返回一个错误)

System V IPC之消息队列

                                      控制消息队列

 

#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 存放消息队列属性的地址

System V IPC之消息队列

System V IPC之消息队列

System V IPC之消息队列

System V IPC之消息队列

System V IPC之消息队列

System V IPC之消息队列