![d37bb61c25c42512d65d5e778dc5fffe.png](https://img-blog.csdnimg.cn/img_convert/d37bb61c25c42512d65d5e778dc5fffe.png)
1 消息队列(Message Queue)
在应用开发中,生产者,消费者的模型非常常见,一方产生数据并把数据放入队列中,而另一方从队列中取数据,先进先出。
同样,在操作系统内核中,也实现了类似的功能,队列中存放的是“消息”。称之为消息队列,消息也可理解为数据。
主要用途是进程间通信(IPC),所谓通信,就是进行数据交互。
![c0b18ee10ff267e9d42892a0b9e5593c.png](https://img-blog.csdnimg.cn/img_convert/c0b18ee10ff267e9d42892a0b9e5593c.png)
2 接口标准(POSIX和 System V)
关于标准接口,Linux系统中提供了POSIX和 System V这两种不同的接口,POSIX为可移植的操作系统接口。System V 是 AT&T 的第一个商业UNIX版本(UNIX System III)的加强。
System V 时期的不同系统接口不一样,给移植带来了一定的麻烦,而POSIX将不同操作系统之间的上层API进行了统一,更换平台时便于移植应用程序。目前Linux中使用POSIX较多,但System V同样也存在。
自Linux kernel 2.6.6 ,开始支持POSIX 的消息队列API。
3 POSIX版的MQ API
函数接口
mqd_t
测试实例:两个终端进行通信,并在dev/mqueue/ 目录中可以看到存在的消息队列
mq3.c 发送消息:"boots"
#include
mq4.c 接收消息:
#include
编译:-lrt ,-l 指的是链接库文件,rt为库的名字rt。也即是librt.a/librt.so
若不加-lrt,链接过程会报错。
gcc mq3.c -o mq3 -lrt
gcc mq4.c -o mq4 -lrt
![8d4803f606203be7c377ca80f9c1de5f.png](https://img-blog.csdnimg.cn/img_convert/8d4803f606203be7c377ca80f9c1de5f.png)
执行:
![fc3c1f918e39d19d5ca6ce7178e4da59.png](https://img-blog.csdnimg.cn/img_convert/fc3c1f918e39d19d5ca6ce7178e4da59.png)
设备查看:QSIZE=0表示消息队列中的数据为空,这时如果再去mq_recive()的调用进程 将被阻塞。
cat /dev/mqueue/mq_test
![db03d10cdd398a76d2c6af18aa78736f.png](https://img-blog.csdnimg.cn/img_convert/db03d10cdd398a76d2c6af18aa78736f.png)
4 System V 版的MQ API
APUE(Unix 环境高级编程)中是以 System V 的API为例进行讲解的。
![b05fde075e93adb07454fbce20a0caf3.png](https://img-blog.csdnimg.cn/img_convert/b05fde075e93adb07454fbce20a0caf3.png)
函数接口
int
测试实例:两个终端进行通信
mq1.c 发送消息:"hello, message queue test..."
#include
mq2.c 接收消息:
#include
编译:
gcc mq3.c -o mq3 -lrt
gcc mq4.c -o mq4 -lrt
![e11cb16921c5ea646f11b268928bf168.png](https://img-blog.csdnimg.cn/img_convert/e11cb16921c5ea646f11b268928bf168.png)
执行:
![90348e75f660950c490ead4732f816a0.png](https://img-blog.csdnimg.cn/img_convert/90348e75f660950c490ead4732f816a0.png)
查看:可以查看到key值为10(0x0A)的MQ,包含id,权限,字节数,消息数
ipcs -q
![34eaa5d66dbd6abd78aa39308fa549ee.png](https://img-blog.csdnimg.cn/img_convert/34eaa5d66dbd6abd78aa39308fa549ee.png)