消息队列的结构体定义问题

BrainstorM1983 2007-06-28 12:06:51
先看看消息队列的消息机构体及读写方式
// 消息结构体
struct msg {
long msg_len;
long msg_type;
char msg_data[1024];
};

// 写入消息
msgsnd(mqid, &(msg.msg_type), msg.msg_len, 0)

// 读出消息
msgrcv(mqid, &(msg.msg_type), 1024, msg.msg_type, 0)

这种写法传递的消息是正确的,能不能解释一下?
我的想法: msg_len根本就没有写入消息,而且从msg_type的地址开始写(struct的内存分配是连续的?),msg_type和msg_data写入了消息队列, 其实跟下面的写法是一样的
// 消息结构体
struct msg {
long msg_type;
char msg_data[1024];
};

// 写入消息
msgsnd(mqid, &msg, 1024, 0)

// 读出消息
msgrcv(mqid, &msg, 1024, msgtype, 0)



问题源于: http://blog.chinaunix.net/u1/40816/showart_323560.html
...全文
663 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dai_weitao 2007-06-29
  • 打赏
  • 举报
回复
如果楼主知道offset宏的实现方法, 就一定知道这个写法是对的了.
cceczjxy 2007-06-29
  • 打赏
  • 举报
回复
linux内核中的大量链表的的操作中就采取了这样的技术.
cceczjxy 2007-06-29
  • 打赏
  • 举报
回复

msgsnd(mqid, &(msg.msg_type), msg.msg_len, 0)

// 读出消息
msgrcv(mqid, &(msg.msg_type), 1024, msg.msg_type, 0)

这种写法传递的消息是正确的,能不能解释一下?
---------------
结构体定义后,内存分配的相对位置是是固定的,可以根据msg_type地址,算出msg_data的地址.

楼主后面的想法是正确的.
mymtom 2007-06-29
  • 打赏
  • 举报
回复
对不起,只看到这个结构
// 消息结构体
struct msg {
long msg_len;
long msg_type;
char msg_data[1024];
};
没有注意到下面的另外结构,所以...
我错了!
楼主的想法完全正确。
BrainstorM1983 2007-06-28
  • 打赏
  • 举报
回复
可以具体解释一下为什么不一样吗?

// 定义1
struct msg {
long msg_type;
char msg_data[1024];
};

// 定义2
struct mymsg {
long int mtype; /* message type */
char mtext[1]; /* message text */
}

两个定义有什么不同, 定义1为什么是不对?
mymtom 2007-06-28
  • 打赏
  • 举报
回复
当然不一样了,关键在于楼主的msg结构定义不对
msgrcv(mqid, &msg, 1024, msgtype, 0)能收到消息,但是解析msg_type会出现错误。

应该是类似这样的结构:
struct mymsg {
long int mtype; /* message type */
char mtext[1]; /* message text */
}

用man msgrcv看一下就知道了。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧