当前位置: 技术问答>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中一樣的數據。
謝謝!
{
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不是一个指针的话,或许会好办一些。
过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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。