Буферизация в стандартной библиотеке на C / C ++ - PullRequest
1 голос
/ 30 октября 2011

У меня есть вопрос о буферизации в стандартной библиотеке для ввода-вывода: я прочитал главу 13 «Интерфейс программирования Linux» о буферизации файлового ввода-вывода, автор упомянул, что стандартная библиотека использует буферизацию ввода-вывода для дискового файлаТерминал.Мой вопрос заключается в том, относится ли эта буферизация ввода-вывода к FIFO, каналу, сокету и сетевому файлу?

Ответы [ 2 ]

1 голос
/ 30 октября 2011

Да, если вы используете стандартную библиотеку ввода-вывода на основе FILE *. Единственная странная вещь, которая может произойти, это если основной системный файловый дескриптор возвращает ненулевое значение для функции isatty. Тогда stdio может «буферизовать строку» как на входе, так и на выходе. Это означает, что он имеет тенденцию сбрасываться, когда видит '\n'.

Я полагаю, что необходим буфер строки stdout, если дескриптор файла 1 возвращает ненулевое значение для isatty.

0 голосов
/ 30 октября 2011

Нет.Все, что является обычным файловым дескриптором (например, возвращаемое open(2), pipe(2), socket(2) и accept(2)), не буферизируется - любые данные, которые вы читаете или записываете в него, сразу же вводятся или выводятся через прямые системные вызовы.

Буферизация происходит только тогда, когда у вас есть FILE* объекты, которые вы можете получить, fopen(3) используя обычный файл на диске;объекты stdin, stdout и stderr также являются FILE* объектами, которые устанавливаются при запуске программы.Буферизация обычно включена на FILE* объектах, но не всегда - ее можно отключить с помощью setbuf(3), а по умолчанию stderr не буферизируется.

Если вы хотите создатьбуферизованный поток из обычного файлового дескриптора, вы можете сделать это с помощью fdopen(3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...