Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
由于fseek()不适用于管道,有什么方法可以模拟向前搜索?天真的方法是使用fread()并丢弃读入内存缓冲区的内容。对于巨大的寻求避免巨大的缓冲区,您将一遍又一遍地使用相同的缓冲区,最终读取仅使用缓冲区的一部分。
fseek()
fread()
但这是唯一的方法吗?是否有另一种方法可以避免缓冲区和潜在的多次读取?
在管道上寻找没有意义,因为输入是动态产生的(不存储在磁盘上)。lseek没有为管道实现内核系统调用。
lseek
还要记住,管道本质上是一个有限的、固定大小的生产者-消费者缓冲区。当它变满时,生产者被挂起,直到消费者读取最旧的数据。
是的,这是唯一的方法。我会在 1k-8k 左右使用缓冲区。读取的系统调用开销小得多,就会发挥作用,而大得多的时候,您将从缓存中驱逐有用的数据。