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 должен быть одним из трёх следующих макросов:
За исключением небуферизованных файлов аргумент 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)
2019-03-06 | Linux |