【发布时间】:2020-01-21 12:41:23
【问题描述】:
考虑以下结构:
struct msg {
int id;
int size;
double *data;
}
现在,该结构将用于通过管道在生产者和消费者进程之间进行通信。
事实上,由于data 指针,它不起作用...所以必须将其更改为实际数据(而不是指向数据的指针)。但复杂的原因在于生产者必须能够发送任意数量的数据(接收者......相应地工作)。
有人可以吗,请指点我一个解决方案? 具体来说:
- 定义数据结构的最佳解决方案是什么?
- 与
char* c_data联合(将其传递给写入)是否可行? - 如何实现
read进行大小核算?
非常感谢您的反馈。
【问题讨论】:
-
您不能在现代受保护系统上的进程之间传输指针。指针对单个进程是私有的,不能被不同的进程使用(即使它是从同一个可执行程序启动的)。
-
编写一个序列化和反序列化函数,将结构转换为抽象的东西,你可以在另一端阅读。您甚至可以将数据转换为字符串
"123 456 789.123"并将其发送并使用printf/scanf函数。 -
@Someprogrammerdude:问题承认并声明 OP 试图发送
double数据(可能是该位置的数组),而不是double *值。 -
您可以简单地将
id的内容、size的内容、size_t(或其他适合您的整数)的内容写入管道,其中包含@的数量987654333@ 值被发送(假设这不是size已经是),然后是double值。只要您使用相同的对象表示写入进程,您就可以发送double对象的原始字节;无需专门对它们进行序列化。在接收器中,读取id、size的值和double项的数量,然后读取指定数量的double值。 -
数组中已经有一个
size元素。看来您想使用旧式 VLA 并执行struct msg{ int id; size_t size; double data[0]; }