Chinaunix首页 | 论坛 | 博客
  • 博客访问: 462161
  • 博文数量: 191
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 172
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-31 14:35
个人简介

没有时间把一件事情做好,却有时间把一件事情反复做!

文章分类

全部博文(191)

文章存档

2016年(2)

2015年(74)

2014年(111)

2013年(4)

我的朋友

分类: LINUX

2014-08-17 17:58:52

原文地址:消息队列 作者:1987hanen

消息队列概述
顾名思义,消息队列就是一个消息的列表。用户可以从消息队列种添加消息、读取消息
等。从这点上看,消息队列具有一定的FIFO 的特性,但是它可以实现消息的随机查询,比
FIFO 具有更大的优势。同时,这些消息又是存在于内核中的,由“队列ID”来标识。
 消息队列实现
1.函数说明
消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操
作。其中创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消
息队列数量的限制;添加消息使用的函数是msgsnd 函数,它把消息添加到已打开的消息队列
末尾;读取消息使用的函数是msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里
可以指定取走某一条消息;最后控制消息队列使用的函数是msgctl,它可以完成多项功能。
 
了msgget函数的语法要点
所需头文件
          #include
          #include
          #include
函数原型   int msgget(key_t key,int flag)
函数传入值
        Key:返回新的或已有队列的队列ID,IPC_PRIVATE
        Flag:
函数返回值
    成功:消息队列ID
    出错:-1
了msgsnd函数的语法要点
 
 
所需头文件
#include
#include
#include
函数原型int msgsnd(int msqid,const void *prt,size_t size,int flag)
函数传入值
msqid:消息队列的队列ID
prt:指向消息结构的指针。该消息结构msgbuf为:
struct msgbuf{
long mtype;//消息类型
char mtext[1];//消息正文
}
size:消息的字节数,不要以null结尾
IPC_NOWAIT若消息并没有立即发送而调用进程会立即返回
flag:
0:msgsnd调用阻塞直到条件满足为止
函数返回值
成功:0
出错:-1
 
 
使用实例
#include
#include
#include
struct msg_buf
    {
        int mtype;
        char data[255];
    };
 
int main()
{
        key_t key;
        int msgid;
        int ret;
        struct msg_buf msgbuf;
 
        key=ftok("/tmp/2",'a');
        printf("key =[%x]\n",key);
        msgid=msgget(key,IPC_CREAT|0666); /*通过文件对应*/
        if(msgid==-1)
        {
                printf("create error\n");
                return -1;
        }
 
        msgbuf.mtype = getpid();
        strcpy(msgbuf.data,"test haha");
        ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
        if(ret==-1)
        {
                printf("send message err\n");
                return -1;
        }
 
        memset(&msgbuf,0,sizeof(msgbuf));
        ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);
        if(ret==-1)
        {
                printf("recv message err\n");
                return -1;
        }
        printf("recv msg =[%s]\n",msgbuf.data);
 
}
 
 
 
 
 
 
 
 
 
 
 
 
阅读(391) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~