【发布时间】:2012-05-07 11:15:07
【问题描述】:
我正在寻找在 C 编程中从 stdin 管道读取数据的最佳方法。
问题:我需要寻找这些数据,即在同一流的end读取一些数据后,我需要从流的start读取数据.
小用例:gunzip -c 4GbDataFile.gz | myprogram
另一个:
- 在本地主机上:
nc -l -p 1234 | myprogram - 在远程主机上:
gunzip -c 4GbDataFile.gz | nc -q 0 theotherhost 1234
我知道从 fifo 读取只能执行一次。所以,目前:
- 我从
stdin到内存slurp所有内容,并在分配的内存中工作。
它很丑,但它有效。一个明显的问题是,如果有人向我的应用程序发送一个巨大的(或连续的)流,我将以分配的大内存块结束,否则我将耗尽内存。 (考虑一个 8Gb 的文件)
我接下来的想法:
- 我设置了该内存块的大小限制(可能是用户定义的)。一旦我从 stdin 读取了这么多数据:
- 要么我停在这里:“错误。内存不足,bazinga。算了吧。”风格。
- 我要么开始转储我正在读取的内容到一个文件,然后在读取所有数据后从该文件开始工作。
但是,那有什么意义呢?我无法找出我正在阅读的数据的来源。如果这是一个本地 8Gb 文件,我会将其转储到同一系统上的另一个 8Gb 文件中。
所以,我的问题是:
当您必须在
stdinpipe 中来回查找时,如何高效地读取大量数据?
提前感谢您的回答。
编辑:
我的程序需要在给定文件的某处(取决于文件格式)读取元数据,因此可能在流的末尾。然后它可能会在流的开头读回其他数据,然后在另一个地方等。简而言之:它需要访问数据的任何字节。
一个例子是在从stdin开始读取之前在不知道文件格式的情况下读取存档文件的数据:我需要检查存档元数据,查找存档文件名称和偏移量等。
所以我将制作标准输入内容的本地副本并使用它。感谢大家的投入;)
【问题讨论】:
-
ITYM
myprogram < 4GbDataFile。目前,cat 4GbDataFile > myprogram会覆盖您的程序二进制文件。当你用管道替换 '>' 时,你对 cat 的使用毫无用处。 -
谢谢,修正了错字,增加了对 cat 的更有用的用法。