Как реализовать кольцевой буфер с использованием файла ?

Мое приложение (программа C) открывает два дескриптора одного и того же файла (один в режиме записи и один в режиме чтения). Два отдельных потока в приложении читают и записывают в файл. Это прекрасно работает. Поскольку мое приложение работает на встроенном устройстве с ограниченным размером RAM-диска, я хотел бы написать FileHandle , чтобы переносить его в начало файла при достижении максимального размера, а чтение FileHandle следовало бы как круговой буфер. Из ответов на этот вопрос я понимаю, что это должно работать. Однако, как только я выполняю fseek или записываю FileHandle в начало файла, fread возвращает ошибку. Будет ли EOF сброшен при выполнении fseek в начало файла? Если да, то какую функцию следует использовать для установки позиции файла записи в 0 без сброса EOF .

EDIT / UPDATE: Я пробовал пару вещей:


  1. На основе @neodelphi я использовал трубы, это работает. Однако мой вариант использования требует, чтобы я записывал в файл. Я получаю несколько каналов потока видеонаблюдения в реальном времени, который необходимо сохранить на жесткий диск, а также прочитать декодированный и отображаемый на мониторе.

  2. Благодаря предложениям @Clement по выполнению ftell, я исправил пару ошибок в моем коде, и для них работает упаковка. однако считыватель считывает, что считанные данные являются устаревшими, поскольку запись все еще буферизуется, но считыватель считывает устаревшее содержимое с жесткого диска. Я не могу избежать буферизации из соображений производительности (я получаю 32 Мбит / с живых данных, которые необходимо записать на жесткий диск). Я пробовал такие вещи, как сброс записи только в интервале от момента обертывания записи до обертывания чтения и усечения файла (ftruncate) после обертывания чтения, но это не решает проблему устаревших данных.

  3. Я пытаюсь использовать два файла в проверке связи -pong fashion, чтобы увидеть, решит ли это проблему, но хочу знать, есть ли лучшее решение

6
задан Community 23 May 2017 в 11:50
поделиться