2

我有一个应用程序将数据(控制数据、访问信息等)写入父进程的管道一端。在子进程中,我想按原样读取该数据。

父进程在许多位置执行许多 write() 操作。为了将数据读入缓冲区,我们需要指定数据的长度

read(int fd, buffer, len).

我的问题是,父进程每次都会写入可变大小的数据。那么子进程如何知道数据的长度。

我试图读取单个字符并将其添加到 buff 中,

char ch;
int n = 0;
while(n >= 0)
{
    n = read(int fd, ch, 1);
    *buff = ch; buff++;
}

但它似乎没有办法做到这一点

请告诉我如何在子进程中读取可变大小的数据?

4

3 回答 3

4

嘿,你问了最古老的问题之一。多年来已经开发了许多答案......

  • 写入按行组织的格式化数据,然后一次读取一行并解析尽可能多的数据
  • 写二进制数据,但先写一个记录类型
  • 如上所述,但在两个级别中,使用二进制数据,包装在带有类型字段的记录中,所有这些都以记录长度字开头。这允许您将阅读器分层构建,较低的 I/O 层可以轻松读取记录并将其长度返回到负责应用程序特定逻辑的较高层。
  • 按行写入格式化数据,但使用前导标识符标识“记录类型”
  • 创建一种语言并为其编写解析器;解析器可能将输入作为文本逐字节读取
  • 将数据组织为XML
  • 将数据组织为YAML
  • 将数据组织为JSON

所有这些技术都有一个共同点:读者必须已经知道编码类型,并且必须使用程序逻辑准备好根据其结构有条件地读取数据。当然,已经编写了可以读取 XML、YAML 和 JSON 的库。

于 2013-02-10T17:52:08.880 回答
4

您需要将格式化的数据放入管道中,这些数据可以在读取端进行解码。也就是说,您必须指定格式/协议才能理解输出的数据。您可以指定长度,或使用以\nor\0字符结尾的行,无论您的数据如何。

于 2013-02-10T17:53:31.087 回答
3

两种最常见和最简单的方法是先以固定大小写入长度,或者使用特殊的记录终止符来告知记录已结束。

于 2013-02-10T17:54:22.333 回答