В чем смысл использования функции setvbuf() в c?

Почему вы хотите выделить блок памяти в setvbuf()?

Я не знаю, почему вы хотите отправить поток чтения/записи в буфер.

Ответ 1

setvbuf не предназначен для перенаправления вывода в буфер (если вы хотите выполнить IO в буфере, который вы используете sprintf и co.), но для жесткого управления буферизацией данного потока.

В действительности, функции C IO не сразу передают данные, которые должны быть записаны в операционную систему, но сохраняют промежуточный буфер, чтобы избежать непрерывного выполнения (потенциально дорогостоящих) системных вызовов, ожидая заполнения буфера до фактического выполнения писать.

Самый простой случай - отключить буферизацию вообще (полезно, например, при записи в файл журнала, куда вы хотите, чтобы данные переходили на диск сразу после каждой операции вывода), или, с другой стороны, для включения блочной буферизации в потоках где он по умолчанию отключен (или настроен на буферизацию строк). Это может быть полезно для повышения производительности.

Установка определенного буфера для вывода может быть полезна, если вы работаете с устройством, которое, как известно, хорошо работает с определенным размером буфера; с другой стороны, вы можете захотеть иметь небольшой буфер, чтобы сократить использование памяти в средах с ограничением памяти или избежать потери большого количества данных в случае потери мощности без полного отключения буферизации.

Ответ 2

В файлах C, открытых с помощью, например, fopen по умолчанию буферизуются. Вы можете использовать setvbuf для подачи собственного буфера или сделать операции с файлами полностью небуферированными (например, stderr).

Его можно использовать для создания fmemopen в системах, которые не имеют этой функции.

Ответ 3

Размер буфера файлов может влиять на ставки ввода-вывода стандартной библиотеки. В главе 5 "Расширенного программирования Стивена" в среде UNIX есть таблица, в которой показана пропускная способность ввода-вывода, значительно увеличивающаяся с размером буфера ввода-вывода, до ~ 16 К, затем выравнивание. Многие другие факторы могут влиять на общую пропускную способность ввода-вывода, поэтому эта "настройка" влияет или может быть не излечимой. Это основная причина "почему", кроме выключения/буферизации.

Ответ 4

Каждая структура FILE имеет буфер, связанный с ней внутри. Причина этого заключается в сокращении ввода-вывода, а реальные операции ввода-вывода являются дорогостоящими. Все ваши чтения/записи будут буферизованы до тех пор, пока буфер не будет заполнен. Все буферизированные данные будут выводиться/поступать в одну реальную операцию ввода/вывода.

Ответ 5

Почему вы хотите выделить блок памяти в setvbuf()?

Для буферизации.

У меня нет подсказки, почему вы хотите отправить поток чтения/записи в буфер.

Я тоже не, но это не то, что он делает дело спорно.

"Функция setvbuf() может использоваться в любом открытом потоке для изменения своего буфера" [мой акцент]. Другими словами, у alread есть буфер, и вся функция выполняет это изменение. Он ничего не говорит о "отправке ваших потоков чтения/записи в буфер". Я предлагаю вам прочитать справочную страницу, чтобы увидеть, что она на самом деле говорит. Особенно эта часть:

Когда выходной поток небуферизован, информация появляется в конечном файле или терминале как только написано; когда он блокируется блоком, многие символы сохраняются и записываются как блок; когда это строка с буферизированными символами, сохраняются до тех пор, пока не будет выведена новая строка или вход не будет считываться из любого потока, подключенного к терминальному устройству (обычно stdin).