便携式C如何在从管道读取时向前寻找

时间:2011-04-27 15:22:40

标签: c pipe seek fseek

由于fseek()对管道无效,因此存在哪些方法可用于模拟前进?天真的方法是使用fread()并将读取的内容丢弃到内存缓冲区中。为了避免使用大量缓冲区,您只需使用缓冲区的一部分就可以反复使用相同的缓冲区。

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

是的,这是唯一的方法。我会在1k-8k左右使用一个缓冲区。如果读取的系统调用开销要小得多,那么你将从缓存中驱逐有用的数据。