Я наблюдаю следующее поведение с методом библиотеки C++ Std std::ostream::write().
Для буферизации данных я использую следующий C++ API
std::ofstream::rdbuf()->pubsetbuf(char* s, streamsize n)
Это прекрасно работает (проверено с помощью утилиты strace), пока размер данных (datasize) мы записываем в файловый поток, используя
std::ofstream::write (const char* s, datasize n)
Меньше 1023 байт (ниже этого значения записи накапливаются до тех пор, пока буфер не заполнится), но когда размер записываемых данных превышает 1023, буфер не учитывается и данные сбрасываются в файл.
например Если я установлю размер буфера на 10 КБ и запишу около 512 байт за раз, strace покажет, что несколько операций записи были объединены в одну запись.
writev(3, [{"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 9728}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 512}], 2) = 10240 ( 10 KB )
writev(3, [{"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 9728}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 512}], 2) = 10240
...
но когда я пишу 1024 байта за раз (оставляя буфер фиксированным до 10 КБ), теперь strace показывает мне, что он не использует буфер, и каждый вызов ofstream::write преобразуется в системный вызов записи.
writev(3, [{NULL, 0}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 1024}], 2) = 1024 ( 1KB )
writev(3, [{NULL, 0}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 1024}], 2) = 1024
...
Есть ли какой-либо вызов C++ API или параметр настройки Linux, который мне не хватает?
std::fflush
манипулятор? - person Basile Starynkevitch   schedule 18.03.2014std::flush
, но он вызывает сброс, что противоречит тому, чего хочет OP. - person Sebastian Redl   schedule 18.03.2014