System V IPC & new

System V IPC & new

本文关键字:new IPC System      更新时间:2023-10-16

我是Linux C和c++编程新手。我试图为系统vipc消息队列创建一个c++类,我有1个问题。我为message编写了这样的类:

class message
{
    friend class queue;
private:
    typedef struct
    {
        long mtype;
    char mdata[maxmsg_buf];
    }msgbuf_t, *msgbuf_ptr_t;
    msgbuf_ptr_t msgbuf_ptr;
public:
    message(void):msgbuf_ptr(NULL)
    {
        msgbuf_ptr = new msgbuf_t;
    }
    ipc::message::message(const long& type, const std::string& data):msgbuf_ptr(NULL)
    {
    msgbuf_ptr = new msgbuf_t;
    msgbuf_ptr->mtype = type;
    if(data.length() <= maxmsg_buf)
    {
    strncpy(msgbuf_ptr->mdata, data.c_str(), data.length());
    }
    }
};
class queue
{
private:
    mutable qid_t qid;
public:
    queue(const key_t& qkey = unique, const perm_t& qperm = usr_rw, const flag_t& qflag = none)
    {
         qid = msgget(qkey, qperm | qflag);
    if(qid == -1)
    {
    throw errno;                //specify exception for queue  
    }
    }
    void send(const ipc::message& msg, const int& sflag) const
    {
    if((msgsnd(qid, &msg.msgbuf_ptr, sizeof(msg.msgbuf_ptr->mdata), sflag)) == -1)
    {
    throw errno;                //specify exception for queue 
    }
    }
};

//Usage:
ipc::queue q(0x0000FFFF, ipc::usr_rw, ipc::create);
ipc::message msg(10L, "First test message for sysVipc queue");
q.send(msg);   //throws EFAULT from here

当我发送msgbuf_ptr给msgsnd系统调用时,它返回EFAULT(坏地址)错误。所以我的问题是:我可以使用operator new分配msgbuf吗?附言:对不起,如果我的英语不好。

问题出在您的queue::send方法中。&msg.msgbuf_ptr是指向指针的指针。省略地址操作符&,您应该没有问题。

编辑:不,等等msg.msgbuf_ptr->mdata是你的信息。所以,你应该这样称呼它:msgsnd(qid, &msg.msgbuf_ptr + sizeof(msg.msgbuf.mtype), sizeof(msg.msgbuf_ptr->mdata), sflag)