代码之家  ›  专栏  ›  技术社区  ›  Ilian Zapryanov

Linux ipc msgsnd()失败

  •  1
  • Ilian Zapryanov  · 技术社区  · 8 年前

        bool msg::send(int key, void* data)
    {
        (void) data;
        bool res = false;
        m_msgId = msgget(key, m_mask);
        if (m_msgId == -1) {
            // noone create it
            if ((m_msgId = msgget(key, m_mask | IPC_CREAT)) == -1) {
                fprintf(stderr, "Error creating message: %d:(%s)\n",
                                                errno,
                                                strerror(errno));
                return res;
            }
        }
    
        union {
           msg m;
           char c[sizeof(msg)];
        } u = {*this}; // it`s a deep copy
    
        // here the program fails //
        int ret = msgsnd(m_msgId, u.c,
                         sizeof(msg), IPC_NOWAIT);
        if (ret == -1) {
            if (errno != EAGAIN) {
               // here is errno 22 //
                fprintf(stderr, "Error creating message: %d:(%s)\n",
                                                errno,
                                                strerror(errno));
    
                return res;
    
            } else {
                if (msgsnd(m_msgId, u.c,
                           sizeof(msg), 0) == -1) {
                    fprintf(stderr, "Error creating message: %d:(%s)\n",
                                                    errno,
                                                    strerror(errno));
                    res = false;
                }
            }
        }
        res = true;
        return res;
    }
    

    如果我尝试发送一个普通的字符串,比如“1234567”,就可以了。但是这个缓冲区发送失败了。我做错了什么? 谢谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   pilcrow    8 年前

    一个EINVAL条件 msgsnd 是吗 "the value of mtype is less than 1" .

    msgsnd 长的 描述消息类型( M型 )然后是消息本身。您错误地没有设置消息类型,因此 msgsnd 将解释第一个 长的 -消息的长度字节数为 M型 .当消息为 "1234567" *this .

    您想定义如下内容:

    struct mymsg {
      long mtype;
      char mtext[SUFFICIENTLY_LARGE];
    };
    

    并将您的消息复制到内存中 多行文本 而显式设置 M型 >=1.