IPC-----消息队列

消息队列
消息队列是在两个进程之间传递二进制数据块数据的一种简单有效的方式。每个数据块都有特定的类型,接收方可以根据类型来有选择的接收数据,而不一定像管道和命名管道那样以先进先出的方式接收数据。
消息队列也有管道一样的不足,就是每个消息的最大长度(msgmax)是有上限的,每一个消息队列的总的字节数(msgmnb)是有上限的,系统上的消息队列的总数(msgmni)也有一个上限。

相关操作函数:
(1)创建消息队列
msgget用于创建消息队列,则与之关联的内核数据结构msqid_ds将被创建并初始化,msqid_ds结构体的定义如下:
这里写图片描述

int msgget(key_t key,int msgflg);
//key:某个消息队列的名字
//msgflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志一样

返回值:成功返回消息队列的标识码;失败返回-1

查看消息队列:ipcs -q
删除消息队列:ipcrm -q key

代码实现:
这里写图片描述

(2)消息队列的控制函数

int msgctl(int msqid,int cmd,struct msqid_ds *buf);

成功返回0,失败返回-1
msqid是msgget的返回值
cmd:是将要采取的动作

(1)IPC_STAT:把msqid_ds结构中的数据设置为消息队列的当前关联值。
(2)IPC_SET:在进程有足够权限的前提下,把消息队列的当前关联值设置为,msqid_ds数据结构中给出的值。
(3)IPC_RMID:删除消息队列。

这里写图片描述
(3)把一条消息添加到消息队列中
这里写图片描述

int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);

msqid:由msgget函数返回的消息队列标识码
msgp:是一个指针,指向准备发送的消息。
msgsz:是msgp指向的消息长度。
msgflg:控制着当前消息队列满或者到达系统上限时将要发生的事情。
返回值:成功返回0,失败返回1.
这里写图片描述

(4)接收消息

ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtype,int msgflg);

msqid参数是由msgget调用返回的消息队列标识符。
*msgp参数用于存储接受的消息。
msgtype参数指定接收何种类型的消息。
msgflg控制msgrcv函数的行为。
返回值:成功返回接收到的消息的bytes,失败返回-1.

这里写图片描述

这里写图片描述
应用:实现客户端与服务端之间的通信
服务端:发送数据
这里写图片描述
客户端:接收数据
这里写图片描述
结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zjx624bjh/article/details/79836547