Есть ли способ выяснить, есть ли input
buffered
или unbuffered
(кроме справочных страниц.)? Не можем ли мы выяснить, какие функции?
Также для echoing
и nonechoing...
Для быстрой справки, где можно найти список, в котором есть данные buffered
, unbuffered
, echoing
и nonechoing
входов?
Буферизованные и небуферизованные входы в C
Ответ 1
Все функции stdio.h
для чтения из FILE
могут демонстрировать либо "буферизованное", либо "небуферизованное" поведение, а также поведение "эхо" или "неэховое" поведение. Что управляет этими вещами, не является той функцией, которую вы используете, а настройками в потоке и/или ее базовом дескрипторе файла.
-
Стандартная библиотечная функция
setvbuf
может использоваться для включения или отключения буферизации ввода (и вывода) библиотеки C, Это не влияет на буферизацию операционной системы. Существует три возможных режима: "полностью буферизованный" (чтение или запись в значительных фрагментах); "буферизованная строка" (буфер до тех пор, пока символ'\n'
не будет прочитан или не написан, но не далее); и "небуферизованный" (все чтения и записи немедленно переходят в ОС). -
Буферизация по умолчанию для новых объектов
FILE
(включаяstdin
и друзей) определяется реализацией. В библиотеках Unixy C по умолчанию всеFILE
полностью заполнены буферизацией с двумя исключениями.stderr
по умолчанию небуферизован. Для любого другогоFILE
, еслиsetvbuf
не использовался на нем во время первого фактического чтения или записи, аisatty
true для базового дескриптора файла, тогдаFILE
становится буферированным по строке. -
Некоторые библиотеки C предоставляют функции расширения, например.
__flbf
и друзей в Linux и Solaris, для чтения некоторых параметров, управляемыхsetvbuf
. Имейте в виду, что, как описано выше, режим буферизации может меняться при первом фактическом чтении или записи, если он не был явно установлен.
Если вход из файла, setvbuf
- единственная ручка, которая у вас есть. Если ввод осуществляется с какого-то канала связи, могут быть и другие кнопки:
-
В POSIX-совместимых системах (прочитайте "все, кроме Windows" ), программа может запросить любой из нескольких различных режимов для ввода терминала. Из них наиболее важным отличием является между "каноническим" и "неканоническим" . Терминал в каноническом режиме демонстрирует как буферизацию, так и эхо. (Эта буферизация отделена от буферизации, которую может использовать библиотека C, если
setvbuf
не используется для ее отключения). Неканонический режим позволяет вам переключаться между буферизацией и эхом отдельно. низкоуровневый интерфейс терминала POSIX является обширным, сложным и позволяет вам читать и записывать все эти настройки. -
Если вы считаете, что хотите положить терминал в неканоническом режиме, прежде чем писать кучу кода против низкоуровневого POSIX API для этого, сначала нужно рассмотреть вопрос о том, следует ли
readline
илиncurses
облегчит вашу жизнь. -
Если вы читаете трубку, вы во власти того, кто пишет ей; вы не можете контролировать размер кусков, которые вы получаете.
-
Если вы читаете сокет, вы можете контролировать некоторый размер кусков, которые вы получаете, осторожно используя
recvmsg
, но гарантий нет. -
Я не знаю, как это работает в Windows.
Ответ 2
Стандарт ISO/IEC 9899-1999 C99
5.1.2.3 Выполнение программы
...
5) Динамика ввода и вывода интерактивных устройств должна иметь место, как указано в 7.19.3. Цель этих требований состоит в том, что небуферизованный или строковый буфер появиться как можно скорее, чтобы убедиться, что подсказки действительно появляются до программа, ожидающая ввода. ...
7.19.3 Файлы
...
3) Когда поток небуферизирован, символы должны появляться из источника или на назначения как можно скорее. В противном случае символы могут накапливаться и передается в или из среды хоста в виде блока. Когда поток полностью буферизуется, символы предназначены для передачи в или из среды хоста в виде блока, когда буфер заполняется. Когда поток буферизируется по строке, символы предназначены для передается в или из среды хоста в виде блока, когда символ новой строки встречается. Кроме того, символы предназначены для передачи в виде блока хосту среда, когда буфер заполняется, когда запрос запрашивается в небуферизованном потоке или когда запрос запрашивается в потоке с линейной буферизацией, который требует передачи символов из среды хоста. Поддержка этих характеристик определяемые реализацией, и могут быть затронуты через функции setbuf и setvbuf. ...
7) При запуске программы три текстовых потока предопределены и их явно не нужно открывать - стандартный вход (для чтения обычного входа), стандартный выход (для записи традиционный выход) и стандартная ошибка (для записи диагностического вывода). Как первоначально открыт, стандартный поток ошибок не полностью буферизирован; стандартный ввод и стандартный выходные потоки полностью буферизуются тогда и только тогда, когда поток можно определить, чтобы не ссылаться к интерактивному устройству.
Ответ 3
Вы можете связать буфер с файлом, включая stdin
, с setvbuf()
. Вы можете изменить режим буферизации на полный, строковый или нет.