linux程序通过消息队列传输数据

原创 2015年11月20日 11:55:15

发送端

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <QMessageBox>

#define SYS_MSG_KEY_VALUE 1002         // 消息队列键值

struct msgstru{
    long mtype; //大于0
    char mtext[512];
};

struct msgstru msg;
int qid = -1;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}


Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    msg.mtype = 1;
    char *c="aaaa";
    memcpy(msg.mtext,c,strlen(c));
   ssize_t ret_value = msgsnd(qid,&msg,sizeof(struct msgstru),IPC_NOWAIT);
   if(ret_value < 0)
       QMessageBox::warning(NULL,"aaaa","aaaa",QMessageBox::Yes);
}

void Widget::on_pushButton_2_clicked()
{
     msgctl(qid,IPC_RMID,0);
}

void Widget::on_pushButton_3_clicked()
{
    qid = msgget(SYS_MSG_KEY_VALUE,IPC_CREAT|0666);
    if(qid <0 || qid ==65536)
        QMessageBox::warning(NULL,"aaaa","aaaa",QMessageBox::Yes);
}

接受端

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define SYS_MSG_KEY_VALUE 1002         // 消息队列键值

struct msgstru{
    long mtype; //大于0
    char mtext[512];
};

struct msgstru msg;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    int qid = msgget(SYS_MSG_KEY_VALUE,IPC_EXCL);
    if(qid < 0 || qid == 65536)
        return;
    while(1)
    {
        sleep(2);
        memset(msg.mtext,0,512);
        ssize_t size = msgrcv(qid,&msg,sizeof(struct msgstru),0,0);
        if(size > 0)
        {
        printf("%s\n",msg.mtext);
        fflush(stdout);
        }
    }
}



Linux系统下-进程间通信(消息队列-详解)

Linux下,进程间通信方式: #(1)管道(Pipe)及有名管道(named pipe): #(2)信号量: #(3)共享内存: #(4)消息队列: #(5)套接口(Socket) #(6)信号(S...
  • sty23122555
  • sty23122555
  • 2016年04月12日 12:31
  • 8202

Linux系统下-进程间通信(消息队列-详解)

Linux下,进程间通信方式: #(1)管道(Pipe)及有名管道(named pipe): #(2)信号量: #(3)共享内存: #(4)消息队列: #(5)套接口(Socket) #(6)信号(S...
  • sty23122555
  • sty23122555
  • 2016年04月12日 12:31
  • 8202

Linux进程间通信——使用消息队列

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。 一、什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。  每个数据块都被认为含有一个...
  • ljianhui
  • ljianhui
  • 2013年08月25日 00:09
  • 99910

基于MQTT协议的消息传输

基于MQTT协议的消息传输为什么MQTT?之前刚写了一篇关于socket的文章,为什么又来一个MQTT?因为MQTT协议就是socket接口实现的啊(socket和MQTT只是层级不一样而已),并且感...
  • dhfsh
  • dhfsh
  • 2017年03月29日 18:00
  • 1318

linux 环境下的进程间的通信——消息队列传输结构体

linux 环境下的进程间的通信方式主要有:管道,有名和无名管道, 这种方式适用于具有亲缘关系的进程之间的通信; 信号: 消息队列: 共享内存: 信号量: 套接字:     这次主要涉...
  • suifeng330104970
  • suifeng330104970
  • 2012年05月15日 14:00
  • 1608

Linux程序设计——信号量、共享内存和消息队列

1、信号量 多线程程序中总有一部分临界代码,编程人员必须确保只有一个进程可以进入临界代码并拥有对资源的独占式访问权。使用信号量机制可以确保进程之间的并发执行。信号量是一个特殊的变量,只允许对它进行等...
  • furney
  • furney
  • 2012年05月15日 15:38
  • 1563

《Linux程序设计》——信号量、共享内存和消息队列

一、信号量  1、
  • Explorer_day
  • Explorer_day
  • 2014年10月19日 00:28
  • 609

进程通信程序整理---消息队列(Linux)

#include #include #include #include #include #include #include #define MSGKEY 123 //定义一个键值,通...
  • zl_95520
  • zl_95520
  • 2017年12月09日 21:00
  • 37

《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列

信号量:用于管理对资源的访问; 共享内存:用于在程序之间高效的共享数据; 消息队列:在程序之间传递数据的一种简单方法; 一、信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临...
  • beitiandijun
  • beitiandijun
  • 2013年08月11日 20:37
  • 1164

Linux程序设计学习笔记----System V进程通信之消息队列

一个或多个进程可向消息队列写入消息,而一个或多个进程可从消息队列中读取消息,这种进程间通讯机制通常使用在客户/服务器模型中,客户向服务器发送请求消息,服务器读取消息并执行相应请求。在许多微内核结构的操...
  • hu1020935219
  • hu1020935219
  • 2014年08月12日 16:33
  • 1375
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux程序通过消息队列传输数据
举报原因:
原因补充:

(最多只允许输入30个字)