Scroll to navigation

setbuf(3) Library Functions Manual setbuf(3)

ИМЯ

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

БИБЛИОТЕКА

Стандартная библиотека языка C (libc, -lc)

СИНТАКСИС

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

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

setbuffer(), setlinebuf():


Начиная с glibc 2.19:
_DEFAULT_SOURCE
В версии glibc 2.19 и более ранних:
_BSD_SOURCE

ОПИСАНИЕ

The three types of buffering available are unbuffered, block buffered, and line buffered. When an output stream is unbuffered, information appears on the destination file or terminal as soon as written; when it is block buffered, many characters are saved up and written as a block; when it is line buffered, characters are saved up until a newline is output or input is read from any stream attached to a terminal device (typically stdin). The function fflush(3) may be used to force the block out early. (See 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

СТАНДАРТЫ

The setbuf() and setvbuf() functions conform to C99.

ПРИМЕЧАНИЯ

POSIX notes that the value of errno is unspecified after a call to setbuf() and further notes that, since the value of errno is not required to be unchanged after a successful call to setbuf(), applications should instead use setvbuf() in order to detect errors.

ОШИБКИ

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

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

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

СМОТРИТЕ ТАКЖЕ

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

ПЕРЕВОД

Русский перевод этой страницы руководства разработал(и) 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 (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.

5 февраля 2023 г. Справочные страницы Linux 6.03