【发布时间】:2021-04-14 13:25:38
【问题描述】:
我有一个客户端进程,它构建一个 IPC 消息结构 queue_msg,它通过 linux IPC 消息队列发送到服务器。大小为 68 字节。 struct 定义为:
struct FOO_TYPE {
long mtype;
struct {
int sev;
char msg[32];
char bt[32];
} foomsg;
};
客户端在函数中本地声明一个指向 FOO_TYPE 结构的指针,并为其分配 malloc 空间。然后代码会加载 sev、msg 和 bt 字段。
static struct FOO_TYPE *FooEntry = NULL;
...代码被剪辑
if (FooEntry == NULL)
FooEntry = malloc(sizeof(struct FOO_TYPE));
memset(FooEntry, 0, sizeof(struct FOO_TYPE));
...代码被剪辑
MsgSize = sizeof(FooEntry) - sizeof(long);
FooEntry->mtype = CHANGESTATUS;
FooEntry->foomsg.sev = serr->serr_data->sev;
strcpy(FooEntry->syserrmsg.emsg, elog);
strcpy(FooEntry->syserrmsg.bt, btlog);
...代码被剪辑
result = msg_snd(FooExchange, FooEntry, MsgSize, IPC_WAIT);
接收 IPC msg 的服务器正在获取 68 个字节(即:sizeof FOO_TYPE),但间歇性地,里面的字段要么丢失,要么是垃圾。
我是否也必须为结构内结构中的字段分配空间??
【问题讨论】:
-
如果你只为指针分配了malloc空间,你就有问题了……但是贴出代码来代替对代码的描述
-
代码没有贴出来,我们无法判断问题出在哪里。
-
另请注意... struct padding 在两个系统上可能不同。当使用 IPC 结构时,您应该使用打包结构
-
除非您在史前机器上,否则您的结构大于 68 字节。 chars + an int + long 为 64 个字节。而且,正如所指出的,可能涉及填充。
-
按要求添加到帖子中的代码段。机器正在运行 RHEL 7.9 - 64 位。