进程同步(四)—— 消息队列

消息队列使用的API与信号量、共享内存类似。 消息队列、信号量、共享内存均可用ipcs命令查看以及ipcrm删除。

msgget首先向内核获取一个消息队列ID。 获取成功后,可用msgctl获取和设置队列相关信息。 msgsnd用于写消息队列。 msgrcv用于读消息队列。

消息队列遵循First In ,First Out规则。 下面是消息队列相关实现代码。

 1 //queuewrite.cpp
 2 #include <sys/types.h>
 3 #include <sys/msg.h>
 4 #include <unistd.h>
 5 #include <string.h>
 6 #include <iostream>
 7 
 8 using namespace std;
 9 
10 const int MSGQUEUE = 0x8769;
11 class msgQueue
12 {
13 public:
14     void initQueue();
15     int getQueueLen();
16     void addMsg(char *msgbuf);
17     int revMsg();
18     void releaseQueue();
19 private:
20     int m_queueID;
21 };
22 
23 void msgQueue::initQueue()
24 {
25     m_queueID = msgget(MSGQUEUE, 0600|IPC_CREAT);
26     if (m_queueID == -1)
27         cout<<"msgget error!";
28 }
29 int msgQueue::getQueueLen()
30 {
31     struct msqid_ds buf;
32     int ret = msgctl(m_queueID, IPC_STAT, &buf);
33     if (ret == -1)
34     {
35         cout<<"get queue len failure!";
36         return ret;
37     }
38     return buf.msg_qnum;
39 }
40 void msgQueue::addMsg(char *msgbuf)
41 {
42     struct msgbuf buf;
43     buf.mtype = 1;
44     memcpy(buf.mtext, msgbuf, sizeof(msgbuf));
45     int ret = msgsnd(m_queueID, &buf, sizeof(buf), IPC_NOWAIT);
46     if (ret != 0)
47     {
48         cout<<"send msg error!";
49         return;
50     }
51 }
52 int msgQueue::revMsg()
53 {
54     struct msgbuf buf;
55     int ret = msgrcv(m_queueID, &buf, sizeof(buf), 0, 0);
56     if (ret == -1)
57     {
58         return 0;
59     }
60     cout<<buf.mtext;
61     return 1;
62 }
63 void msgQueue::releaseQueue()
64 {
65     msgctl(m_queueID,IPC_RMID,0);
66 }
67 int main()
68 {
69     msgQueue FIFO;
70     char buf[512];
71     FIFO.initQueue();
72     while(1)
73     {
74         cin>>buf;
75         FIFO.addMsg(buf);
76     }
77     return 0;
78 }

执行后向消息队列插入内容,使用ipcs -q命令查看。

 读消息队列只需修改main函数如下:

 1 int main()
 2 {
 3     msgQueue FIFO;
 4     FIFO.initQueue();
 5     int queLen = FIFO.getQueueLen();
 6     while(queLen--)
 7     {
 8         FIFO.revMsg();
 9     }
10     return 0;
11 }

测试结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

[WCF 4.0新特性] 标准终结点与无(.SVC)文件服务激活

今天介绍WCF 4.0的另外两个新特性:标准终结点(Standard Endpoint)和无(.SVC)文件服务激活(File-Less Activation)...

19910
来自专栏大闲人柴毛毛

架构高性能网站秘笈(六)——构建数据缓冲区

到此为止,一共介绍了四种服务器性能优化的方法,分别是:动态内容缓存、浏览器缓存、反向代理缓存、Web组件分离。我们发现在这四种方法中,“缓存”占了大头!确实如此...

3476
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(九)--- 与Redis的交互(mranney/node_redis)入门

简介和安装 redis简介: 开源高性能key-value存储;采用内存中(in-memory)数据集的方式,也可以采用磁盘存储方式(前者性能高,但数据可能丢失...

3608
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第26章 RL-TCPnet之DHCP应用

本章节为大家讲解RL-TCPnet的DHCP应用,学习本章节前,务必要优先学习第25章的DHCP基础知识。有了这些基础知识之后,再搞本章节会有事半功倍的效果。

781
来自专栏我是攻城师

如何在Elasticsearch里面使用索引别名

3758
来自专栏大闲人柴毛毛

架构高性能网站秘笈(二)——动态内容缓存

什么是动态内容缓存? 浏览器向服务器发送请求后,服务器会根据浏览器的要求做相应的处理(如:数据库操作),然后将处理后的结果注入JSP页面生成HTML,最后将生...

2926
来自专栏java 成神之路

jvm 性能调优工具之 jps

2677
来自专栏陈树义

1.Redis 的安装

一、Redis 介绍 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。...

2839
来自专栏程序猿DD

Spring Cloud构建微服务架构:消息驱动的微服务(消费分区)【Dalston版】

通过上一篇《消息驱动的微服务(消费组)》的学习,我们已经能够在多实例环境下,保证同一消息只被一个消费者实例进行接收和处理。但是,对于一些特殊场景,除了要保证单一...

3224
来自专栏菩提树下的杨过

ActiveMQ笔记(6):消息延时投递

在开发业务系统时,某些业务场景需要消息定时发送或延时发送(类似:飞信的短信定时发送需求),这时候就需要用到activemq的消息延时投递,详细的文档可参考官网说...

2245

扫码关注云+社区