/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. Python学习笔记:概要

    1.print不同的互动解释语句输出和输出 在以下示例,我们分配字符串值到可变myString.先用print 要显示一个变量的内容, 其次是变量名,以显示. >>> myStrin ...

  2. 多种语言socket编程集锦—win32

    原文 http://www.blogjava.net/huyi2006/articles/263831.html 借此地方整理以下socket编程的多种语言的实现,socket可以跨平台的通信,因此多 ...

  3. Ejb in action(七)——message与JMS

    我们扩大MDBs学前,我们需要理解message(新闻)与JMS(Java Message Service)的概念. 我们在Java EE中谈论消息,实际上就是意味着实现一个松耦合的过程.系统组件之间 ...

  4. Android小应用-----画画板

    public class MainActivity extends Activity { private ImageView iv; float startX = 0; float startY = ...

  5. servlet请求转发与重定向的差别------用生活实例来形象说明两者的差别

    1,请求重定向:client行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保留,地址栏的URL地址会改变. 2,请求转发:server行为,req ...

  6. C语言内存对齐(2)

    前两天参加了360测试实习生的笔试,碰到了一个有关c语言内存对齐的题目,回来后实现了一下,下面是代码: #include <stdio.h> #include <stdlib.h&g ...

  7. jQuery.form Ajax无刷新上传错误 (jQuery.handleError is not a function) 解决方案

    今天,随着ajaxfileupload时间firebug财报显示,"jQuery.handleError is not a function"错误.因为一旦使用jQuery.for ...

  8. HDU 2064 汉诺塔III

    汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. 整理 W3CSchool 常用的CSS属性列表

    近期教学给学员总结常用的CSS属性,方便学习查询,正好发上来也给大家分享一下,O(∩_∩)O. 摘选自:http://www.w3cschool.com.cn/ 表格最右列的数字标识支持的CSS最低版 ...

  10. git 简单教程更新

    0.初始化 $ git config --global user.name "xxx" $ git config --global user.email "xxx@gma ...