2011-04-27 7 views
8

Dado que fseek() no funciona en las tuberías, ¿qué métodos existen para simular la búsqueda de avance? El enfoque ingenuo es usar fread() y tirar los contenidos leídos en el búfer de memoria. Para grandes intentos de evitar enormes búferes, utilizaría el mismo búfer una y otra vez con la lectura final utilizando solo una parte del búfer.¿Cómo funciona en C portátil para buscar hacia adelante cuando se lee desde un conducto

¿Pero este es el único enfoque? ¿Hay alguna otra manera que evite el buffer y la posible lectura múltiple?

Respuesta

4

Sí, es la única manera. Usaría un buffer en algún lugar alrededor de 1k-8k. Con mucho más pequeño, la sobrecarga de syscall para lectura entrará en juego, y con mucho más grande, desalojará los datos útiles de la memoria caché.

5

La búsqueda no tiene sentido en las tuberías porque la entrada se produce dinámicamente (no almacenada en el disco). La llamada al sistema kernel lseek no está implementada para pipes.

También tenga en cuenta que una tubería es esencialmente una memoria intermedia productor-consumidor de un tamaño limitado y fijo. Cuando se llena, el productor se suspende hasta que el consumidor lea los datos más antiguos.

+0

@hippietrail: si hay dudas sobre un búfer y varias llamadas 'leídas()' para omitir los datos, quizás sea mejor no usar un tubo en absoluto. Haga que la fuente escriba en un archivo de disco, luego el extremo del sumidero de la tubería puede usar llamadas familiares 'lseek()'. – wallyk

+0

Por supuesto, pero a veces la salida producida dinámicamente tiene un formato conocido. – hippietrail

+0

@wallyk: Algunas de las razones por las que utilicé las canalizaciones en el pasado incluyen el procesamiento de XML a partir de enormes archivos comprimidos y el procesamiento XML sobre la marcha a medida que llega a través de Internet. A veces lo que está buscando solo requiere una parte de la información completa, a veces no tiene espacio en el disco para tener todos esos archivos sin comprimir. – hippietrail

Cuestiones relacionadas