当前位置:  技术问答>linux和unix

消息隊列

    来源: 互联网  发布时间:2016-05-26

    本文导语:  typedef struct {    int d;    char *text; }At; struct msgbuf {    long mtype;    struct At at; }msg_sbuf; 調用msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.at),IPC_NOWAIT); 在另外的進程里面進程接受的時候,像msgrcv(msgid,&msg_rbuf,sizeof(msg_rbuf.at),m...

typedef struct
{
   int d;
   char *text;
}At;

struct msgbuf
{
   long mtype;
   struct At at;
}msg_sbuf;

調用msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.at),IPC_NOWAIT);

在另外的進程里面進程接受的時候,像msgrcv(msgid,&msg_rbuf,sizeof(msg_rbuf.at),msg_rbuf.mtype,IPC_NOWAIT|IPC_NOERROR);
其中 msg_rbuf的數據結構和msg_sbuf是一樣的。

請問怎么樣解析msg_rbuf,才能得到和msg_sbuf中一樣的數據。
謝謝!

|
必须向struct msgbuf这个结构进行必要的序列化和反序列化,才可以做到。

过struct At结构中的char *text不是一个指针的话,或许会好办一些。

|
下面是序列化函数, 写得不完善, 不知能否说说明问题

void* serial_msgbuf(struct msgbuf *msg)
{
      int msgbuf_len = sizeof(long) + sizeof(int) * 2 + strlen(msg->at.text) + 1;
      char* tmp = (char*)malloc(msgbuf_len);
      memset(tmp, 0, msgbuf_len);
      char* p = tmp;

      *(long*)p  = msg->mtype;
      p += sizeof(long);

      *(int*)p = msg->at.d;
      p += sizeof(int);

      int slen = strlen(msg->at.text);
      *(int)p = slen;
      p += sizeof(int);
      memcpy(p, msg->at.text, slen);

      return tmp;
}


下面是反序列化函数,写得不完善

struct msgbuf* unserial_msgbuf(void *buf)
{
      char *p = (char*)buf;
      struct msgbuf *msg= (struct msgbuf*)malloc(sizeof(struct msgbuf));

      msg->mtype = *(long*)p;
      p += sizeof(long);

      msg->at.d = *(int*)p;
      p += sizeof(int);      

      int slen = *(int*)p; //strlen(msg->at.text);
      p += sizeof(int);
      msg->at.text = (char*)malloc(slen+1);
      memcpy(msg->at.text, p, slen);

      return tmp;
}


你需要自己管理指针的释放问题,这种方法可能比较麻烦,你可以考虑一个更好的方法来实现

|
另一种方法,修改为下面的结构——不用指针,改用数组

typedef struct 

  int d; 
  char text[256]; //如果不够用就 512 或者 1024
}At;

|


呵呵, 这确实是消息队列的一个局限,我曾经也不得不改用了命名管道。

|
msgrcv直接接收就可以了, 接收到的就是你需要的结构体

|


当你遇到指针时,情况恐怕结果就不会像你想象得那样简单了

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JavaScript中的消息框(警告框,确认框,提示框)语法
  • 消息队列中消息大小
  • HP-UX 下消息队列能否保证消息包的先进先出?
  • 各位专家,如何知道消息队列中消息是否已经超时了?
  • 用java,怎样实现从一个类的发一个消息(消息本身也是一个类)到另一个类?
  • **********写了一个简单的UDP程序,接受英文的消息正常,接受中文的消息显示不完整,请问是什么原因
  • sco unix中消息队列中的一次可发送的最长消息的字节长度是多少?
  • 消息队列消息总大小的问题
  • 重分求解,UNIX下的消息队列非常失败,经常发生堵塞现象,现改用FIFO,但FIFO又得自己设计消息,请高手指点
  • 消息队列收不到消息
  • 怎样在程序中修改一个系统V消息队列中消息的个数::
  • 关于消息队列的问题
  • 创建消息队列,接受消息失败,接受程序再发送错误消息给发送程序//程序能运行,不出结果
  • 一个消息队列例子,第一次运行正确,第二次运行就提示消息发送失败了
  • unix下一个关于消息队列的问题
  • MQTT 消息代理 Mosquitto
  • 怎么查询消息队列中每条消息的状态
  • 关于消息队列
  • linux 消息队列长度的问题
  • Linux下使用C++互斥访问文件+消息队列
  • liunx 消息队列的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3