путаница в буфере - PullRequest
       4

путаница в буфере

2 голосов
/ 19 февраля 2011

Может ли кто-нибудь уточнить типы буферов, используемые программой?

Например:

У меня есть программа на C, которая читает из стандартного ввода в стандартный вывод.

Какие здесь задействованы буферы? Я знаю, что есть 2. Один предоставлен ядром, над которым пользователь не имеет никакого контроля. Один из них оснащен стандартными потоками, а именно stdout, stdin и stderr. Каждый из них имеет отдельный буфер.

Правильно ли мое понимание?

Спасибо, John

Ответы [ 2 ]

0 голосов
/ 19 февраля 2011

Ядро (или другая базовая система) может иметь любое количество уровней буферизации, в зависимости от того, с какого устройства читается, и деталей реализации ядра; в некоторых системах нет буферизации на этом уровне, данные считываются непосредственно в буфер пространства пользователя.

Библиотека stdio выделяет буфер для stdin; Размер зависит от реализации, но вы можете контролировать размер и даже использовать свой собственный буфер с setvbuf. Это также позволяет вам контролировать, полностью ли буферизован ввод / вывод (столько данных считывается в буфер, сколько доступно), буферизуется строка (данные считываются только до новой строки) или небуферизируется. По умолчанию используется линейная буферизация, если система может определить, что вход является терминалом, иначе полностью буферизован.

История похожа на стандартный вывод. По умолчанию stderr небуферизован.

0 голосов
/ 19 февраля 2011

Если вы работаете с linux/unix, вам будет проще понять, что есть три потока, а именно

1. STDIN: ЗНАЧЕНИЕ ФАЙЛА ОПИСАНИЯ 0 (IN unix)

2. STDOUT : ЗНАЧЕНИЕ ФАЙЛА ОПИСАНИЯ 1

3. STDERR : ЗНАЧЕНИЕ ФАЙЛА ОПИСАНИЯ 2

По умолчанию эти потоки соответствуют клавиатуре и монитору. В Unix мы можем изменить эти потоки для чтения ввода из файла вместо клавиатуры. Для отображения вывода в файле, а не для монитора, используйте close (), dup () системные вызовы. Да, задействовано 3 буфера. Для очистки содержимого входного буфера в c мы используем функцию fflush () . Если вы хотите узнать больше об обработке этих потоков в UNIX, дайте мне знать.

...