Mi aplicación (programa C) abre dos manejadores de archivo para el mismo archivo (uno en escritura y otro en modo lectura). Dos hilos separados en la aplicación leen y escriben en el archivo. Esto funciona bien Dado que mi aplicación se ejecuta en un dispositivo incrustado con un tamaño de disco RAM limitado, me gustaría escribir FileHandle
para ajustar al principio del archivo al alcanzar el tamaño máximo y leer FileHandle
para seguirlo como un búfer circular. Entiendo de las respuestas a this question que esto debería funcionar. Sin embargo, tan pronto como lo hago fseek
de escribir FileHandle
al comienzo del archivo, fread
devuelve el error. ¿El EOF
se restablecerá al hacer fseek
al principio del archivo? Si es así, qué función se debe utilizar para provocar que la posición del archivo de escritura se establezca en 0 sin que se restablezca EOF
.¿Cómo implementar un búfer circular usando un archivo?
EDIT/UPDATE: me trató par de cosas:
Basado en @neodelphi Solía tuberías esto funciona. Sin embargo, mi uso requiere que escriba en un archivo. Recibo múltiples canales de transmisión de video en vivo que necesita almacenarse en el disco duro y también leerse decodificado y mostrarse en el monitor.
Gracias a las sugerencias de @Clement para hacer ftell, corrigí un par de errores en mi código y envolví trabajos para el lector; sin embargo, los datos leídos parecen ser obsoletos ya que la escritura aún está almacenada pero el lector lee contenido obsoleto disco. No puedo evitar el almacenamiento en búfer debido a consideraciones de rendimiento (obtengo 32Mbps de datos en vivo que deben escribirse en el disco duro). He intentado cosas como las escrituras de barrido solo en el intervalo desde que se escriben las envolturas hasta cuando se vuelven a leer y truncar el archivo (ftruncate) después de las vueltas de lectura, pero esto no resuelve el problema de datos obsoletos.
Estoy tratando de utilizar dos archivos en la moda de ping-pong para ver si esto resuelve el problema, pero quiero saber si hay una mejor solución
¿Estás bloqueando mientras lees y escribes el archivo? –
Si está desarrollando un sistema similar a Linux, ¿intentó archivos de tuberías? Este tipo de archivos solo almacena lo que se ha escrito pero no leído, por lo que implementar un buffer circular puede no ser necesario. – neodelphi
@Clement. No estoy teniendo bloqueos. Yo uso std C lib fread y fwrite calls – Badri