Мое приложение (программа C) открывает два дескриптора одного и того же файла (один в режиме записи и один в режиме чтения). Два отдельных потока в приложении читают и записывают в файл. Это прекрасно работает.
Поскольку мое приложение работает на встроенном устройстве с ограниченным размером RAM-диска, я хотел бы написать FileHandle
, чтобы переносить его в начало файла при достижении максимального размера, а чтение FileHandle
следовало бы как круговой буфер. Из ответов на этот вопрос я понимаю, что это должно работать. Однако, как только я выполняю fseek
или записываю FileHandle
в начало файла, fread
возвращает ошибку. Будет ли EOF
сброшен при выполнении fseek
в начало файла? Если да, то какую функцию следует использовать для установки позиции файла записи в 0 без сброса EOF
.
EDIT / UPDATE: Я пробовал пару вещей:
На основе @neodelphi я использовал трубы, это работает. Однако мой вариант использования требует, чтобы я записывал в файл. Я получаю несколько каналов потока видеонаблюдения в реальном времени, который необходимо сохранить на жесткий диск, а также прочитать декодированный и отображаемый на мониторе.
Благодаря предложениям @Clement по выполнению ftell, я исправил пару ошибок в моем коде, и для них работает упаковка. однако считыватель считывает, что считанные данные являются устаревшими, поскольку запись все еще буферизуется, но считыватель считывает устаревшее содержимое с жесткого диска. Я не могу избежать буферизации из соображений производительности (я получаю 32 Мбит / с живых данных, которые необходимо записать на жесткий диск). Я пробовал такие вещи, как сброс записи только в интервале от момента обертывания записи до обертывания чтения и усечения файла (ftruncate) после обертывания чтения, но это не решает проблему устаревших данных.
Я пытаюсь использовать два файла в проверке связи -pong fashion, чтобы увидеть, решит ли это проблему, но хочу знать, есть ли лучшее решение