/author:DriverMonkey
//phone:13410905075

//mail:bookworepeng@Hotmail.com

//qq:196568501

#include <pthread.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <string.h>

#include <iostream>

#define MAX_SEND_SIZE 80

#define RETURN_MSG_TYPE 0XAA

#define SEND_MSG_TYPE 0X55

using namespace std;

struct mymsgbuf {

long mtype;

char mtext[MAX_SEND_SIZE];

};

static void *thread_GUI(void *arg);

static void *thread_logic(void *arg);

static int init_message(unsigned char key);

static void send_message(int qid,

                            struct mymsgbuf *qbuf,

                            long type,

                            const void *text,

                            int size);

static int read_message(int qid, struct mymsgbuf *qbuf, long type);

static void remove_queue(int qid);

static int message_id = 0;

int main ()

{

    pthread_t thread_GUI_id = 0;

    pthread_t thread_logic_id = 0;

message_id = init_message('g');

    

    pthread_create (&thread_GUI_id, NULL, &thread_GUI, NULL);

    pthread_create (&thread_logic_id, NULL, &thread_logic, NULL);

pthread_join (thread_GUI_id, NULL);

    pthread_join (thread_logic_id, NULL);

 

    return 0;

}

static void *thread_GUI(void *arg)

{

    int sleep_count = 0;

    mymsgbuf send_buf;

    

    sleep_count = 10;

    char send_v = 0;

while(sleep_count--)

    {

        send_v++;

        send_message(message_id, &send_buf , SEND_MSG_TYPE, &send_v,sizeof(send_v));

        //cout<<"thead_GUI: sleep_count = "<<sleep_count<<endl;

        //sleep(1);

    }

}

static void *thread_logic(void *arg)

{

    int sleep_count = 0;

    mymsgbuf recive_buf;

sleep_count = 10;

    while(sleep_count--)

    {

        //cout<<"thread_logic: sleep_count = "<<sleep_count<<endl;

        read_message(message_id,&recive_buf, SEND_MSG_TYPE);

        //sleep(1);

    }

}

int init_message(unsigned char key)

{

    int id = 0;

    

    key = ftok(".", key);

id = msgget(key, IPC_CREAT|0777);

    if(id == (-1))

        while(1);// should never in

        

    return id;

}

void send_message(int qid,

                            struct mymsgbuf *qbuf,

                            long type,

                            const void *text,

                            int size)

{

    qbuf->mtype = type;

    memcpy(qbuf->mtext, text,size);

    cout<<"send = " <<(int)qbuf->mtext[0]<<endl;

    if((msgsnd(qid, (struct msgbuf *)qbuf,size,NULL) == -1))

        while(1);//shoud never in

qbuf->mtype = type;

    msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, RETURN_MSG_TYPE, 0);

    cout<<"send return= " << (int)qbuf->mtext[0]<<endl;

    cout<<qbuf->mtext<<endl;

}

int read_message(int qid, struct mymsgbuf *qbuf, long type)

{

    int read_size = 0;

    static int temp = 100;

    

    qbuf->mtype = type;

    temp++;

    read_size = msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0);

    cout<<"read = " << (int)qbuf->mtext[0]<<endl;

    char const *return_message = "message_ok";

    strcpy(qbuf->mtext, return_message);

    

    qbuf->mtext[0] = temp++;

    qbuf->mtype = RETURN_MSG_TYPE;

    msgsnd(qid, (struct msgbuf *)qbuf,strlen(return_message)+1,NULL);

    cout<<"read return ="<<(int)qbuf->mtext[0]<<endl;

}

void remove_queue(int qid)

{

}

linux 消息队列例子的更多相关文章

  1. linux消息队列编程实例

    转自:linux 消息队列实例 前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权 ...

  2. LINUX消息队列实战之一

    前言 能说能抄能论皆不算,能写能打才是真功夫. 唠叨 反正我也是一个孤独的程序猿,多说一些奇奇怪怪的唠叨也无妨,第一次写消息队列,书本的东西和实战很不同,根据实战总结的一些注意事项会和大家分享,也敲打 ...

  3. linux 消息队列的限制

    消息队列的系统限制 作者:冯老师,华清远见嵌入式学院讲师. 消息队列是System V的IPC对象的一种,用于进程间通信,会受到系统的限制,本文主要描述了三个限制.第一:议个消息的最大长度:第二:消息 ...

  4. linux 消息队列

    消息队列,这个可是鼎鼎大名,经常在某些地方看见大家那个膜拜,那个,嗯,那个... 那就给个完整的例子,大家欣赏就行,我一直认为不用那个,嗯@ 这个队列的最大作用就是进程间通信,你要非搞个持久化,那也行 ...

  5. linux消息队列通信

    IPC机制 进程间通信机制(Inter Process Communication,IPC),这些IPC机制的存在使UNIX在进程通信领域手段相当丰富,也使得程序员在开发一个由多个进程协作的任务组成的 ...

  6. Linux消息队列应用

    #include"sys/types.h" #include "sys/msg.h" #include "unistd.h" #includ ...

  7. linux消息队列操作

    对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...

  8. linux消息队列的使用

    消息队列 *消息队列是内核地址空间中的内部链表,通过内核在各个进程之间传递的内容.消息顺序发送到消息队列中,每个消息队列都有IPC标识符唯一地进行标识. msgbuf结构 struct msgbuf{ ...

  9. Linux消息队列

    #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/ms ...

随机推荐

  1. CSS知识总结之浏览器(持续更新)

    web页面浏览器渲染过程 1.解析html文件,并构建DOM树: 在DOM树中,每一个html标签都有一个对应的节点,并且每一个文本也有一个对应 的节点(js的textNode),DOM树的根节点就是 ...

  2. J2EE

    随笔分类 - J2EE   关于SpringMVC Json使用 摘要: 很简单的一个东西,这里就不做过多介绍了,写一个小Demo,随手记录下.首先,在搭好SpringMVC工程环境之后,如果想用Sp ...

  3. Goldeneye.py网站压力测试工具2.1版源码

    Goldeneye压力测试工具的源代码,粗略看了下,代码写的蛮规范和易读的,打算边读边加上了中文注释,但是想来也没太大必要,代码600多行,值得学习的地方还是蛮多的,喜欢Python的同学可以一读 这 ...

  4. 处理程序“svc-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决办法:以管理员运行命令:C: ...

  5. 【转】Android 工程在4.0基础上混淆

    Android现在对安全方面要求比较高了,我今天要做的对apk进行混淆,用所有的第三方工具都不能反编译,作者的知识产权得到保障了,是不是碉堡了.   一,首先说明我这是在4.0基础上进行的.   先看 ...

  6. Javascript Array API

    JS数组对象提供了很多API方法,由于前段时间要用到某一些方法,但是突然一时又想不起来该怎么用了,上网找有很多资料都不全,所以就自己整理了一篇,完全是自己写的的JS,只是复制到这里来了 ,要用到的朋友 ...

  7. 介绍一款基于jquery好用的编辑框htmlbox.full.js

    1. 可选择背景颜色,自主选择工具,感觉挺好用的,不过需要注意,添加引用后找不到工具图标的图片,找到脚本修改idir:属性改成自己的图片文件夹存放路径即可. asp.net mvc3提交内容报错提示含 ...

  8. 云优化的概念、Entity Framework 7.0、简单吞吐量压力测试

    云优化的概念.Entity Framework 7.0.简单吞吐量压力测试 继续上一篇<开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1)>之 ...

  9. Visual Studio 2013 上使用 Github

    教你如何在 Visual Studio 2013 上使用 Github 介绍 我承认越是能将事情变简单的工具我越会更多地使用它.尽管我已经知道了足够的命令来使用Github,但我宁愿它被集成到IDE中 ...

  10. enode框架

    enode框架 2.0 step by step之整体架构介绍 前言 enode框架简介 enode架构图 command handler一次只处理一个command 让domain生活在in mem ...