【问题标题】:Message queue msgsnd mtext field消息队列 msgsnd mtext 字段
【发布时间】:2010-01-29 09:25:58
【问题描述】:

当使用 msgsnd 时,手册页中提到的结构是

 struct mymsg {
     long mtype;    /* message type */
     char mtext[1]; /* body of message */
 };

但是如果你像这样使用它

func(char *array, int sizeofarray)
{
     struct mymsg {
         long mtype;    /* message type */
         char *ptr; /* body of message */
     };

    msgq.mtype = 1;
    msgq.ptr = array;

    msgsnd(msqid, &msgq, sizeofarray, 0);
}

将ptr分配给某个本地数组[200](数组可以作为函数中的参数获取),另一端收到的消息是垃圾邮件。这是为什么呢?

【问题讨论】:

    标签: linux message-queue


    【解决方案1】:

    这是垃圾,因为您指定的结构不是msgsnd 想要的形式。它希望复制的数据立即跟随内存中的mtype 值,而不是在其他地方的数组中。

    如果要发送长度为 200 的数组,则需要执行以下操作:

    struct mymsg {
        long mtype;
        char mtext[200];
    } foo;
    
    foo.mtype = 1;
    memcpy(foo.mtext, array, 200);
    
    msgsnd(msqid, &foo, 200, 0);
    

    【讨论】:

      【解决方案2】:

      即使由于 caf 指出的原因这没有错,假设您做了类似的事情:

      func(char *array)
      {
           struct mymsg 
           {
               long mtype;    /* message type */
               char *ptr; /* body of message */
           };
      
          msgq.mtype = 1;
          msgq.ptr = array;
      
          msgsnd(msqid, &msgq, sizeof(ptr), 0);
      }
      

      如果另一个进程正在读取队列,那么 ptr 对它意味着什么?如果有的话,它会在不同的地址空间中指向什么?

      【讨论】:

      • 不是 sizeof(ptr) 而是原始数组的大小。无论如何..我已经猜到了caf回答的答案。我刚刚确认了。
      • 我知道。你错过了重点。我试图展示别的东西。
      猜你喜欢
      • 2018-09-09
      • 2017-08-25
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      相关资源
      最近更新 更多