Использование и эффекты флагов O_SYNC и O_DIRECT очень сбивают с толку и, как представляется, несколько различаются среди платформ. На странице руководства Linux (см. Пример здесь), O_DIRECT обеспечивает синхронный ввод-вывод, сводит к минимуму эффекты кеша и требует, чтобы вы сами выполняли выравнивание размера блока, O_SYNC просто гарантирует синхронный ввод-вывод. Хотя обе гарантии, что данные записываются в кеш жесткого диска, я считаю, что операции прямого ввода-вывода должны быть быстрее, чем обычные синхронные операции ввода-вывода, поскольку они обходят кеш страниц (хотя в man-странице FreeBSD для open (2) указано, что кеш обходит, когда используется O_SYNC. См. здесь).
В чем именно различия между флагами O_DIRECT и O_SYNC? Некоторые реализации предполагают использование O_SYNC | O_DIRECT. Зачем?