setvbuf () - параметр размера, когда buf равен NULL - PullRequest
2 голосов
/ 22 мая 2011

Кажется, что когда я запускаю следующий код:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv)
{
    int i=0;

    setvbuf(stdout, NULL, _IOLBF,0);

    while (1)
            printf("%d ",i++);

    return 0;
}

, он печатает блоками по 1024 символа, независимо от того, какой размер определен для setvbuf ().Вопрос в том, влияет ли size в этом случае и откуда исходит определение для 1024 символов.

Ответы [ 3 ]

3 голосов
/ 22 мая 2011

Я не знаю, как вы определили 1024, но, вероятно, BUFSIZ.BUFSIZ определено в stdio.h.

Если buf равен NULL, тогда библиотека stdio автоматически выделяет буфер для использования с потоком (если мы не выберем небуферизованный ввод / вывод).

РЕДАКТИРОВАТЬ

Вот что glibc говорит:

Макрос: int BUFSIZ Значением этого макроса является целочисленное константное выражение, котороехорошо использовать в качестве аргумента размера для setvbuf.Это значение гарантированно равно не менее 256 .

Значение BUFSIZ выбирается в каждой системе, чтобы сделать эффективными потоковые операции ввода-вывода.Поэтому рекомендуется использовать BUFSIZ в качестве размера буфера при вызове setvbuf. * ​​1023 *

EDIT 2

@ larsmans - это правильно.Я посмотрел, как реализовано setvbuf, и он игнорирует вызов при запросе буферизации строки и представлении пустого буфера.Теперь stdout - это не обычный файл, он прикреплен к терминалу.Таким образом, переход к pixelbeat

  • Размер буфера напрямую влияет только на режим буферизации
  • Размер по умолчанию, такой как ядро, зависит от размера страницы (4096 байт в моей системе)
  • если stdin / stdout подключен к терминалу, то размер по умолчанию = 1024;
    , остальной размер = 4096
1 голос
/ 22 мая 2011

Согласно (черновому) стандарту C,

Если buf не является нулевым указателем, массив, на который он указывает, может использоваться вместо буфера, выделенного функцией setvbufа аргумент size указывает размер массива;в противном случае size может определять размер буфера, выделенного функцией setvbuf.[Выделение добавлено.]

Итак, если вы правильно измерили, кажется, что Glibc может делать все, что пожелает, когда buf равен нулю, и это дает вам буфер 1 КБ.Поскольку вы никогда не пишете новую строку, буферизация строки не имеет никакого эффекта, и ее поведение аналогично полной буферизации.

0 голосов
/ 22 мая 2011

Размер, вероятно, не сильно влияет на NULL-указатель буфера.

Однако вы все еще запрашиваете буферизованный вывод с помощью _IOLBF Попробуйте _IONBF.

http://en.wikipedia.org/wiki/Setvbuf

...