消息队列的建立过程

    消息队列提供了一种由一个进程向另一个进程发送块数据的方法。另外,每一个数据块被看作有一个类型,而接收进程可以独立接收具有不同类型的数据块。消息队列的好处在于我们几乎可以完全避免同步问题,并且可以通过发送消息屏蔽有名管道的问题。更好的是,我们可以使用某些紧急方式发送消息。坏处在于,与管道类似,在每一个数据块上有一个最大尺寸限制,同时在系统中所有消息队列上的块尺寸上也有一个最大尺寸限制。


消息队列的建立过程分为四步:
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

你可能感兴趣的:(struct,float,2010)