消息队列的建立过程
2010-09-23 21:01
218 查看
消息队列提供了一种由一个进程向另一个进程发送块数据的方法。另外,每一个数据块被看作有一个类型,而接收进程可以独立接收具有不同类型的数据块。消息队列的好处在于我们几乎可以完全避免同步问题,并且可以通过发送消息屏蔽有名管道的问题。更好的是,我们可以使用某些紧急方式发送消息。坏处在于,与管道类似,在每一个数据块上有一个最大尺寸限制,同时在系统中所有消息队列上的块尺寸上也有一个最大尺寸限制。
消息队列的建立过程分为四步:
1. 获得获得项目相关的IPC键值,建立一个相对惟一的key值; 通过函数ftok函数实现;
2. 通过key值创建或打开消息队列; 通过函数msgget函数来实现;
3. 如果存在初始化一个IPC ; 通过函数***ctl函数来实现;(在消息队列中不包含此步;)
4. 操作一个IPC;分为发送(向消息队列中写入数据)与接收(从消息队列中读取数据);
通过函数msgsnd与函数msgrcv来实现;
具体的函数功能请查看手册;
/*******************************************************
*功能:消息队列发送子程序;
*
*日期:Sep 23th. 2010
*作者:Ropen Yuan
*版本:V1.0
* *****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define PATHNAME "tmp" //文件可以任意打定,必须要指定对其路径
#define PROJID 12 //指定ftok函数的参数id
typedef struct student //定义一个学生的成绩的结构体;
{
char name[20];
float score;
}STUD;
typedef struct msgbuf //定义一个消息结构由两种方式来限定,第一,必须小于系统限制,第二必须以long
{ //int 开始,这在接收函数中会用作一个消息类型;
long int mtype;
STUD student;
}BUFS;
int main(void)
{
//消息队列:第一步建立一个相对惟一的key值
key_t key=ftok(PATHNAME, PROJID); //获得获得项目相关的IPC键值;合成一个相对惟一的key;
if(key==-1) //检测ftok函数的返回值,函数执行成功返回合成的key,失败返回-1;
{
perror("in msgsnd ,ftok");
exit(-1);
}
//第二步:创建或打开消息队列
int msgid = msgget(key, IPC_CREAT | 0600); //创建或打开消息队列
if(msgid == -1) //函数成功执行返回新生成的消息队列的描述符,失败返回-1;
{
perror("in msgsnd, msgget");
exit(-1);
}
//第三步,向消息队列中写入数据
BUFS buf; //定义一个消息队列结构体;并且给消息队列元素赋值;
buf.mtype = 8;
buf.student.score = 90.9;
strcpy(buf.student.name, "zhangsan");
int ret = msgsnd(msgid,&buf,sizeof(buf)-sizeof(long),0); //成功返回0,失败返回1;
if(ret == -1)
{
perror("in msgsnd, msgsnd");
exit(-1);
}
return 0;
}
/*******************************************************
*功能:消息队列接收子程序;
*
*日期:Sep 23th. 2010
*作者:Ropen Yuan
*版本:V1.0
* *****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define PATHNAME "tmp" //文件可以任意打定,必须要指定对其路径
#define PROJID 12 //指定ftok函数的参数id
typedef struct student //定义一个学生的成绩的结构体;
{
char name[20];
float score;
}STUD;
typedef struct msgbuf //定义一个消息结构由两种方式来限定,第一,必须小于系统限制,第二必须以long
{ //int 开始,这在接收函数中会用作一个消息类型;
long int mtype;
STUD student;
}BUFS;
int main(void)
{
//消息队列:第一步建立一个相对惟一的key值
key_t key=ftok(PATHNAME, PROJID); //获得获得项目相关的IPC键值;合成一个相对惟一的key;
if(key==-1) //检测ftok函数的返回值,函数执行成功返回合成的key,失败返回-1;
{
perror("in msgrcv ,ftok");
exit(-1);
}
//第二步:创建或打开消息队列
int msgid = msgget(key, IPC_CREAT | 0600); //创建或打开消息队列
if(msgid == -1) //函数成功执行返回新生成的消息队列的描述符,失败返回-1;
{
perror("in msgrcv, msgget");
exit(-1);
}
//第三步,从消息队列中读取数据
BUFS buf; //定义一个消息队列结构体;并且给消息队列元素赋值;
int ret = msgrcv(msgid,&buf,sizeof(buf)-sizeof(long),8,0); //成功返回读取的消息长度,失败返回-1;
if(ret == -1)
{
perror("in msgrcv, msgrcv");
exit(-1);
}
printf("buf.student.name=%s/nbuf.student.score=%3.2f/n",buf.student.name,buf.student.score);
return 0;
}
如若转载请请注明链接http://blog.csdn.net/RopenYuan
消息队列的建立过程分为四步:
1. 获得获得项目相关的IPC键值,建立一个相对惟一的key值; 通过函数ftok函数实现;
2. 通过key值创建或打开消息队列; 通过函数msgget函数来实现;
3. 如果存在初始化一个IPC ; 通过函数***ctl函数来实现;(在消息队列中不包含此步;)
4. 操作一个IPC;分为发送(向消息队列中写入数据)与接收(从消息队列中读取数据);
通过函数msgsnd与函数msgrcv来实现;
具体的函数功能请查看手册;
/*******************************************************
*功能:消息队列发送子程序;
*
*日期:Sep 23th. 2010
*作者:Ropen Yuan
*版本:V1.0
* *****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define PATHNAME "tmp" //文件可以任意打定,必须要指定对其路径
#define PROJID 12 //指定ftok函数的参数id
typedef struct student //定义一个学生的成绩的结构体;
{
char name[20];
float score;
}STUD;
typedef struct msgbuf //定义一个消息结构由两种方式来限定,第一,必须小于系统限制,第二必须以long
{ //int 开始,这在接收函数中会用作一个消息类型;
long int mtype;
STUD student;
}BUFS;
int main(void)
{
//消息队列:第一步建立一个相对惟一的key值
key_t key=ftok(PATHNAME, PROJID); //获得获得项目相关的IPC键值;合成一个相对惟一的key;
if(key==-1) //检测ftok函数的返回值,函数执行成功返回合成的key,失败返回-1;
{
perror("in msgsnd ,ftok");
exit(-1);
}
//第二步:创建或打开消息队列
int msgid = msgget(key, IPC_CREAT | 0600); //创建或打开消息队列
if(msgid == -1) //函数成功执行返回新生成的消息队列的描述符,失败返回-1;
{
perror("in msgsnd, msgget");
exit(-1);
}
//第三步,向消息队列中写入数据
BUFS buf; //定义一个消息队列结构体;并且给消息队列元素赋值;
buf.mtype = 8;
buf.student.score = 90.9;
strcpy(buf.student.name, "zhangsan");
int ret = msgsnd(msgid,&buf,sizeof(buf)-sizeof(long),0); //成功返回0,失败返回1;
if(ret == -1)
{
perror("in msgsnd, msgsnd");
exit(-1);
}
return 0;
}
/*******************************************************
*功能:消息队列接收子程序;
*
*日期:Sep 23th. 2010
*作者:Ropen Yuan
*版本:V1.0
* *****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define PATHNAME "tmp" //文件可以任意打定,必须要指定对其路径
#define PROJID 12 //指定ftok函数的参数id
typedef struct student //定义一个学生的成绩的结构体;
{
char name[20];
float score;
}STUD;
typedef struct msgbuf //定义一个消息结构由两种方式来限定,第一,必须小于系统限制,第二必须以long
{ //int 开始,这在接收函数中会用作一个消息类型;
long int mtype;
STUD student;
}BUFS;
int main(void)
{
//消息队列:第一步建立一个相对惟一的key值
key_t key=ftok(PATHNAME, PROJID); //获得获得项目相关的IPC键值;合成一个相对惟一的key;
if(key==-1) //检测ftok函数的返回值,函数执行成功返回合成的key,失败返回-1;
{
perror("in msgrcv ,ftok");
exit(-1);
}
//第二步:创建或打开消息队列
int msgid = msgget(key, IPC_CREAT | 0600); //创建或打开消息队列
if(msgid == -1) //函数成功执行返回新生成的消息队列的描述符,失败返回-1;
{
perror("in msgrcv, msgget");
exit(-1);
}
//第三步,从消息队列中读取数据
BUFS buf; //定义一个消息队列结构体;并且给消息队列元素赋值;
int ret = msgrcv(msgid,&buf,sizeof(buf)-sizeof(long),8,0); //成功返回读取的消息长度,失败返回-1;
if(ret == -1)
{
perror("in msgrcv, msgrcv");
exit(-1);
}
printf("buf.student.name=%s/nbuf.student.score=%3.2f/n",buf.student.name,buf.student.score);
return 0;
}
如若转载请请注明链接http://blog.csdn.net/RopenYuan
相关文章推荐
- RabbitMQ镜像模式双节点部署时故障转移过程中队列中消息的状态
- 往消息队列传数据的存储过程
- live555_RTSP连接建立以及请求消息处理过程
- live555学习之RTSP连接建立以及请求消息处理过程
- live555学习之RTSP连接建立以及请求消息处理过程
- windows 窗口过程 线程消息队列
- 6.7.1 读信过程中的结构体建立--qmgr_message_alloc函数:初始化active队列中的邮件
- TCP全连接队列和半连接队列已满之后的连接建立过程抓包分析
- 生产环境消息队列ActiveMQ的数据积压优化过程
- 再谈非模态对话框的销毁 / 对话框建立过程/ 对话框销毁过程/ 消息传递过程
- 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务填坑过程
- live555学习之RTSP连接建立以及请求消息处理过程
- 再谈非模态对话框的销毁 / 对话框建立过程/ 对话框销毁过程/ 消息传递过程
- windows 7 下SYSTEM账户建立的MSMQ消息队列如何删除
- 为控制台窗口建立消息队列
- windows 7 下SYSTEM账户建立的MSMQ消息队列如何删除
- "已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)"
- 已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)
- OpenStack建立实例完整过程源码详细分析(12)----依据AMQP通信架构实现消息发送机制解析之一
- OpenStack建立实例完整过程源码详细分析(13)----依据AMQP通信架构实现消息发送机制解析之二