message queue是System V IPC中的三剑客之一(分别是message queue, semaphore, shared memory),其主要是由下面4个函数调用构成: (msgget, msgctl, msgsnd, msgrcv),下面列举出具体的应用,以作备份
(1) msgsend.cxx (创建message queue, 并且发送message到内核的消息队列里面)
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
#include<stdio.h>
#include<iostream>
using namespace std;
#define BUF_SIZE 100
typedef struct {
long mtype;
char mtext[BUF_SIZE];
} msg_info;
key_t getkey()
{
key_t key = ftok("/home/kingoal",1);
if(key == -1)
{
perror("Error on create key");
exit(-1);
}
return key;
}
int create_msg_queue()
{
int msg_id;
key_t key = getkey();
msg_id = msgget(key, IPC_CREAT|0660);
if(msg_id == -1)
{
perror("msgget error");
exit(-1);
}
return msg_id;
}
int send_message(int msg_id,char* message)
{
int result;
msg_info MsgInfo;
memset(&MsgInfo,0,sizeof(msg_info));
MsgInfo.mtype = 10;
strcpy(MsgInfo.mtext, message);
result = msgsnd(msg_id,&MsgInfo,strlen(message)+1,0);
if(result == -1)
{
perror("Failed to send message");
}
return result;
}
int show_msg_queue_stat(int msg_id)
{
struct msqid_ds MsgQueueInfo;
int result;
result = msgctl(msg_id,IPC_STAT, &MsgQueueInfo);
if(result == -1)
{
perror("Error on message control");
exit(-1);
}
cout<<"============= Message Queue Info ============="<<endl;
cout<<"Effective user id: "<<MsgQueueInfo.msg_perm.uid<<endl;
cout<<"Effective user group id: "<<MsgQueueInfo.msg_perm.gid<<endl;
cout<<"Current numbers of bytes in message queue(non-standard): "<<MsgQueueInfo.msg_cbytes<<endl;
cout<<"Current numbers of message in the queue: "<<MsgQueueInfo.msg_qnum<<endl;
cout<<"=============================================="<<endl;
return result;
}
int main(int argc,char* argv[])
{
int msg_id = create_msg_queue();
send_message(msg_id,"Hello message queue");
show_msg_queue_stat(msg_id);
return 0;
}
(2) msgrcv.cxx(从内核里面读取消息,最后删除内核中的message queue)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define BUF_SIZE 100
typedef struct {
long mtype;
char mtext[BUF_SIZE];
}msg_info;
int rcv_msg(int msg_id,int msg_type,char* msg)
{
int result;
msg_info MsgInfo;
result = msgrcv(msg_id,&MsgInfo,BUF_SIZE,msg_type,IPC_NOWAIT);
if(result == -1)
{
if( errno == ENOMSG)
return errno;
perror("Error on message receive");
exit(-1);
}
strcpy(msg,MsgInfo.mtext);
return result;
}
int main(int argc,char* argv[])
{
int result;
char message[BUF_SIZE];
int msg_type;
int msg_id;
if(argc != 3)
{
printf("Usage: %s msgid msg_type\n", argv[0]);
return -1;
}
msg_type = atoi(argv[2]);
msg_id = atoi(argv[1]);
while(1)
{
result = rcv_msg(msg_id,msg_type,message);
if(result == ENOMSG)
break;
printf("Message: %s\n",message);
memset(message,0,BUF_SIZE);
}
msgctl(msg_id,IPC_RMID,NULL);
return 0;
}
(3)执行结果
[kingoal@sunrise ~/dev/cxx]$ ./msgsend
============= Message Queue Info =============
Effective user id: 1001
Effective user group id: 1001
Current numbers of bytes in message queue(non-standard): 20
Current numbers of message in the queue: 1
==============================================
[kingoal@sunrise ~/dev/cxx]$ ./msgsend
============= Message Queue Info =============
Effective user id: 1001
Effective user group id: 1001
Current numbers of bytes in message queue(non-standard): 40
Current numbers of message in the queue: 2
==============================================
[kingoal@sunrise ~/dev/cxx]$ ./msgsend
============= Message Queue Info =============
Effective user id: 1001
Effective user group id: 1001
Current numbers of bytes in message queue(non-standard): 60
Current numbers of message in the queue: 3
==============================================
[kingoal@sunrise ~/dev/cxx]$ ./msgsend
============= Message Queue Info =============
Effective user id: 1001
Effective user group id: 1001
Current numbers of bytes in message queue(non-standard): 80
Current numbers of message in the queue: 4
==============================================
[kingoal@sunrise ~/dev/cxx]$ ./msgsend
============= Message Queue Info =============
Effective user id: 1001
Effective user group id: 1001
Current numbers of bytes in message queue(non-standard): 100
Current numbers of message in the queue: 5
==============================================
[kingoal@sunrise ~/dev/cxx]$ ipcs
Message Queues:
T ID KEY MODE OWNER GROUP
q 786432 22754234 --rw-rw---- kingoal kingoal
Shared Memory:
T ID KEY MODE OWNER GROUP
Semaphores:
T ID KEY MODE OWNER GROUP
[kingoal@sunrise ~/dev/cxx]$ main 786432 10
Message: Hello message queue
Message: Hello message queue
Message: Hello message queue
Message: Hello message queue
Message: Hello message queue
[kingoal@sunrise ~/dev/cxx]$
分享到:
相关推荐
1. Message Queue的角色 在你的Android程序里,新诞生一个线程,或称执行(Thread)时,并不会自动建立其Message Loop。 Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过...
MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战
详细描述了Android的消息处理机制,Message和MessageQueue类的详解
Message,MessageQueue,Looper,Handler详解
进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....
Looper MessageQueue 源码解析,通过源码 手写一套自己的Handler。
Handler+Looper+MessageQueue
本例子主要是发送不同的消息。然后根所ID得到指定的消息内容。
一个 windows message queue 的通讯例子,消息机制的客户端和服务器端交互通通讯。
是一个快速的开源消息组件(框架),支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,和J2EE1.4容器无缝结合,并且支持轻量级容器和大多数跨语言客户端上的Java虚拟机。消息异步接受,减少软件多系统集成...
Qload Webpshere message queue, WMQ, MQ
比较了Zermoq MQTT Rabbitmq 等多种Message Queue方案
基于JMS标准的消息中间件实现的产品有很多,JBossMQ、ActiveMQ、OpenMQ、OpenJMS等等,最常用的还是...由于Open MQ源自Sun的Java Message Queue,所以其具有Java System Message Queue拥有的所有特性,功能和性能。
Sun Java System Message Queue
基于Websphere Message Queue 的Client通信技术,韩珊珊,翟文军,Websphere Message Queue (WMQ)是一款应用广泛的IBM的商业通讯中间件(Commercial Messaging Middleware),适用于任何需要进行网络通信的系统。...
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理. 简单定义: 1、Message Queue(消息队列): 用来存放通过Handler发布的消息,通常...
“消息队列”是 Microsoft 的消息处理技术,它在任何安装了 Microsoft Windows 的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。 “消息队列网络”...
本指南的目标读者为需要执行 Message Queue 管理任务的系统管理员以及应用程序 ...Message Queue 管理员负责设置和管理 Message Queue 消息传送系统,尤其是该系 统的核心 Message Queue 消息服务器。
http://blog.csdn.net/lindonglian
详细的描述了消息队列的使用场合及注意事项,使用技巧等