9

由于fseek()不适用于管道,有什么方法可以模拟向前搜索?天真的方法是使用fread()并丢弃读入内存缓冲区的内容。对于巨大的寻求避免巨大的缓冲区,您将一遍又一遍地使用相同的缓冲区,最终读取仅使用缓冲区的一部分。

但这是唯一的方法吗?是否有另一种方法可以避免缓冲区和潜在的多次读取?

4

2 回答 2

6

在管道上寻找没有意义,因为输入是动态产生的(不存储在磁盘上)。lseek没有为管道实现内核系统调用。

还要记住,管道本质上是一个有限的、固定大小的生产者-消费者缓冲区。当它变满时,生产者被挂起,直到消费者读取最旧的数据。

于 2011-04-27T15:26:11.267 回答
5

是的,这是唯一的方法。我会在 1k-8k 左右使用缓冲区。读取的系统调用开销小得多,就会发挥作用,而大得多的时候,您将从缓存中驱逐有用的数据。

于 2011-04-27T15:38:50.727 回答