Scroll to navigation

SETBUF(3) Руководство программиста Linux SETBUF(3)

ИМЯ

setbuf, setbuffer, setlinebuf, setvbuf - операции с буферизацией потока

СИНТАКСИС

#include <stdio.h>
void setbuf(FILE *stream, char *buf);
void setbuffer(FILE *stream, char *buf, size_t size);
void setlinebuf(FILE *stream);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

setbuffer(), setlinebuf():
начиная с glibc 2.19:
_DEFAULT_SOURCE
glibc 2.19 и старее:
_BSD_SOURCE

ОПИСАНИЕ

Существует три типа буферизации: отсутствие буферизации, блочная буферизация и строковая буферизация. Когда выходной поток не буферизируется, то информация незамедлительно оказывается на терминале или в файле назначения; при блочной буферизации сначала сохраняется большое количество символов, а затем они записываются за один раз; при строковой буферизации все символы сохраняются в буфере до появления символа перевода строки при выводе или при вводе из любого потока, подключённого к устройству терминала (обычно, stdin). Функцию fflush(3) можно использовать для досрочного окончания блочной буферизации (смотрите fclose(3)).

Обычно, для файлов включена блочная буферизация. Если поток ссылается на терминал (обычно для stdout), то он буферизируется построчно. Стандартный поток ошибок stderr по умолчанию никогда не буферизируется.

Функция setvbuf() может быть использована для изменения типа буферизации любого открытого потока. Параметр mode должен быть одним из трёх следующих макросов:

_IONBF
отключить буферизацию
_IOLBF
строковая буферизация
_IOFBF
полная буферизация

За исключением небуферизованных файлов аргумент buf должен указывать на буфер размером, как минимум, size байт; этот буфер будет использоваться вместо текущего. Если аргумент buf равен NULL, то это отразится только на типе буферизации; при следующей операции чтения или записи будет создан новый буфер. Функция setvbuf() может быть использована только после открытия потока и до выполнения над ним любых операций.

Остальные три вызова, фактически, являются псевдонимами вызова setvbuf(). Функция setbuf() в точности соответствует вызову


setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

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


setvbuf(stream, NULL, _IOLBF, 0);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция setvbuf() возвращает 0 при нормальном завершении работы. При ошибках она возвращает ненулевое значение (некорректное значение mode или запрос невозможно выполнить). При ошибках может быть соответственно изменено значение errno.

Другие функции не возвращают никаких значений.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
setbuf(), setbuffer(), setlinebuf(), setvbuf() Безвредность в нитях MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ

Функции setbuf() и setvbuf() соответствуют стандарту C89 и C99.

ДЕФЕКТЫ

Вы должны удостовериться, что пространство, на которое указывает buf, всё ещё существует, в то время как stream закрыт, что обычно случается при закрытии программы. Например, следующее будет неправильным:

#include <stdio.h>
int
main(void)
{

char buf[BUFSIZ];
setbuf(stdin, buf);
printf("Hello, world!\n");
return 0; }

СМ. ТАКЖЕ

stdbuf(1), fclose(3), fflush(3), fopen(3), fread(3), malloc(3), printf(3), puts(3)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

6 марта 2019 г. Linux