Я работаю над встроенным приложением видеозаписи Linux, которое записывает видео в формате MP4 в файл (на SD-карту в формате FAT).
Некоторые усложняющие факторы заключаются в том, что видео- и аудиоданные поступают от аппаратных кодеков, которые должны обслуживаться с малой задержкой и должны записываться в буферы, поддерживающие DMA.
На данный момент для выходного файла я использую open() и write(), но обнаружил, что write() может занять сотни миллисекунд, чтобы вернуться, когда система находится под нагрузкой, поэтому мои записи выполняются в отдельном потоке.
В нынешнем виде я копирую данные из (небольшого, ограниченного числа) буферов DMA в многомегабайтный кольцевой буфер с функцией malloc, а затем записываю() из него в другом потоке. Это означает, что я делаю как минимум две копии: одну в буфер приложения и одну в кеш системного буфера.
Я рассматриваю возможность использования записи O_DIRECT, чтобы избежать копирования, но меня интересуют любые комментарии. Я заметил, что Роберт Лав комментирует, что O_DIRECT ужасен, но не говорит, почему.
С другой стороны, мне также было бы интересно, если бы кто-нибудь знал способ заставить функцию write() не останавливаться на длительные периоды времени (AIO?), тогда я мог бы использовать буферный кеш, как задумал Линус.
Этот вопрос связан с моим очень старым вопросом о приостановке записи.