【问题标题】:IPC System V message queue - sending a chunk of an arrayIPC System V 消息队列 - 发送一个数组块
【发布时间】:2015-12-17 18:14:44
【问题描述】:

我正在编写一个程序,我需要使用消息队列在进程之间传递一个数组片段(不能为此使用共享内存......)。这个数组片段的长度可能不同,所以我想知道最好的方法是什么——我可以在运行时指定消息大小吗?我知道我可以通过队列传递这样的结构:

struct msg {
    long type;
    char data[N];
};

其中 N 是在编译时确定的,而 AFAIK,我不能这样做:

struct msg {
    long type;
    char *data;
};

因为指针的内容不会被复制,只有它的值...

那么解决这个值的最佳方法是什么?我应该选择什么 N 才能让它有效地工作?发送char data[1] 好吗?我担心如果很少有进程会请求大表,则会造成瓶颈并且效率不高。我的担心有效吗?

【问题讨论】:

    标签: c ipc


    【解决方案1】:

    分配您的消息结构并像这样发送消息:

    int sendMessage( int msqid, int flags, long type, const char *data, size_t data_size )
    {
        struct msgbuf *msg;
        size_t msg_size = sizeof( msg->mtype ) + data_size;
        msg = malloc( msg_size );
        msg->mtype = type;
        memcpy( msg->mtext, data, data_size );
        int rc = msgsnd( msqid, msg, msg_size, flags );
        free( msg );
        return( rc );
    }
    

    参见msgsnd/msgrcv 的手册页http://man7.org/linux/man-pages/man2/msgop.2.html

    【讨论】:

      【解决方案2】:

      定义数组的最大大小,假设它是 1024。

       #define MAX_SIZE 1024
      

      像这样声明你的结构:

      struct msg {
          long type;
          char data[MAX_SIZE];
      };
      

      发送时仅发送N 字节的内容。

      struct msg m;
      // fill the data with N bytes
      msgsnd(msqid, &m, N, msgflg);
      

      要填充数据,您可以使用例如memcpy 函数。

      memcpy(msg.data, your_array + start_index_of_the_slice, N);
      

      接收时指定最大尺寸,即MAX_SIZE。通过检查msgrcv 的返回值来检查实际接收了多少字节。

      struct msg m;
      N = msgrcv(msqid, &m, MAX_SIZE, msgtyp, msgflg);
      // use the first N data bytes
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-29
        • 2010-12-15
        • 2020-04-18
        • 1970-01-01
        • 2011-05-05
        • 2012-12-07
        • 2012-09-19
        • 2021-03-12
        相关资源
        最近更新 更多