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

消息队列使用的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

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

39410
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

5637
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2787
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2990
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4425
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3318
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2946
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5488
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7306
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8848

扫码关注云+社区