您的位置:首页 > 其它

消息队列的建立过程

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐