gpt4 book ai didi

c - 在 C 中通过管道传递结构体

转载 作者:行者123 更新时间:2023-11-30 14:32:22 24 4
gpt4 key购买 nike

考虑以下结构:

struct msg { 
int id;
int size;
double *data;
}

现在,该结构将用于通过生产者进程和消费者进程之间的管道进行通信。

事实上,由于data指针的原因,它不起作用......所以它必须更改为实际数据(而不是指向数据的指针)。但复杂性源于这样一个事实:生产者必须能够发送任意数量的数据(并且接收者......相应地工作)。

有谁可以给​​我一个解决方案吗?具体来说:

  • 定义数据结构的最佳解决方案是什么?
  • char* c_data union (将其传递给写入)是正确的方法吗?
  • 如何实现read来计算大小?

非常感谢您的反馈。

最佳答案

不幸的是,没有本地方法可以通过管道发送任意对象。但是,您可以通过在 fread() and fwrite() 的帮助下发送原始数据来轻松实现您想要的目标。作为以二进制形式序列化数据的一种非常简单的方法。

请记住,为了使以下内容正常工作,生产者和消费者程序都需要在同一台机器上编译,使用相同的数据结构定义和可能相同的编译器标志。

这是一个简单的解决方案:

  1. 创建一个供生产者和接收者使用的 header 结构的通用定义:

    struct msg_header { 
    int id;
    int size;
    };

    这将保存有关真实 data 的信息。我建议您使用size_t存储大小,因为它是无符号的并且更适合此目的。

  2. 生产者中,准备要与正确 header 一起发送的数据,例如:

    struct msg_header header = {.id = 0, .size = 4};
    double *data = {1.23, 2.34, 3.45, 4.56};

    它显然不需要这样声明,它甚至可以通过 malloc() 动态调整大小和分配,重要的是你知道尺寸。

  3. 仍然在生产者中,通过管道发送 header 和后面的数据:

    // Use fdopen() if you don't already have a FILE*, otherwise skip this line.
    FILE *pipe = fdopen(pipe_fd, "w");

    // Send the header through the pipe.
    fwrite(&header, sizeof(header), 1, pipe);

    // Send the data through the pipe.
    fwrite(&data, sizeof(*data), header.size, pipe);
  4. 消费者中,读取 header ,然后使用 .size读取正确数据量的值:

    // Use fdopen() if you don't already have a FILE*, otherwise skip this line.
    FILE *pipe = fdopen(pipe_fd, "r");

    struct msg_header header;
    double *data;

    // Read the header from the pipe.
    fread(&header, sizeof(header), 1, pipe);

    // Allocate the memory needed to hold the data.
    data = malloc(sizeof(*data) * header.size);

    // Read the data from the pipe.
    fread(&data, sizeof(*data), header.size, pipe);

请记住,在上述每个函数调用之后,您都必须检查错误。我没有在示例中添加错误检查只是为了使代码更简单。请参阅手册页以获取更多信息。

关于c - 在 C 中通过管道传递结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59841421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com