Почему вы хотите выделить блок памяти в setvbuf()
?
Я не знаю, почему вы хотите отправить поток чтения/записи в буфер.
Почему вы хотите выделить блок памяти в setvbuf()
?
Я не знаю, почему вы хотите отправить поток чтения/записи в буфер.
setvbuf
не предназначен для перенаправления вывода в буфер (если вы хотите выполнить IO в буфере, который вы используете sprintf
и co.), но для жесткого управления буферизацией данного потока.
В действительности, функции C IO не сразу передают данные, которые должны быть записаны в операционную систему, но сохраняют промежуточный буфер, чтобы избежать непрерывного выполнения (потенциально дорогостоящих) системных вызовов, ожидая заполнения буфера до фактического выполнения писать.
Самый простой случай - отключить буферизацию вообще (полезно, например, при записи в файл журнала, куда вы хотите, чтобы данные переходили на диск сразу после каждой операции вывода), или, с другой стороны, для включения блочной буферизации в потоках где он по умолчанию отключен (или настроен на буферизацию строк). Это может быть полезно для повышения производительности.
Установка определенного буфера для вывода может быть полезна, если вы работаете с устройством, которое, как известно, хорошо работает с определенным размером буфера; с другой стороны, вы можете захотеть иметь небольшой буфер, чтобы сократить использование памяти в средах с ограничением памяти или избежать потери большого количества данных в случае потери мощности без полного отключения буферизации.
В файлах C, открытых с помощью, например, fopen
по умолчанию буферизуются. Вы можете использовать setvbuf
для подачи собственного буфера или сделать операции с файлами полностью небуферированными (например, stderr
).
Его можно использовать для создания fmemopen
в системах, которые не имеют этой функции.
Размер буфера файлов может влиять на ставки ввода-вывода стандартной библиотеки. В главе 5 "Расширенного программирования Стивена" в среде UNIX есть таблица, в которой показана пропускная способность ввода-вывода, значительно увеличивающаяся с размером буфера ввода-вывода, до ~ 16 К, затем выравнивание. Многие другие факторы могут влиять на общую пропускную способность ввода-вывода, поэтому эта "настройка" влияет или может быть не излечимой. Это основная причина "почему", кроме выключения/буферизации.
Каждая структура FILE
имеет буфер, связанный с ней внутри. Причина этого заключается в сокращении ввода-вывода, а реальные операции ввода-вывода являются дорогостоящими.
Все ваши чтения/записи будут буферизованы до тех пор, пока буфер не будет заполнен. Все буферизированные данные будут выводиться/поступать в одну реальную операцию ввода/вывода.
Почему вы хотите выделить блок памяти в setvbuf()?
Для буферизации.
У меня нет подсказки, почему вы хотите отправить поток чтения/записи в буфер.
Я тоже не, но это не то, что он делает дело спорно.
"Функция setvbuf() может использоваться в любом открытом потоке для изменения своего буфера" [мой акцент]. Другими словами, у alread есть буфер, и вся функция выполняет это изменение. Он ничего не говорит о "отправке ваших потоков чтения/записи в буфер". Я предлагаю вам прочитать справочную страницу, чтобы увидеть, что она на самом деле говорит. Особенно эта часть:
Когда выходной поток небуферизован, информация появляется в конечном файле или терминале как только написано; когда он блокируется блоком, многие символы сохраняются и записываются как блок; когда это строка с буферизированными символами, сохраняются до тех пор, пока не будет выведена новая строка или вход не будет считываться из любого потока, подключенного к терминальному устройству (обычно stdin).