setvbuf не может сделать stdin небуферизованным

Мое основное намерение состояло в том, чтобы вернуть getchar как только он получит символ вместо ожидания клавиши ENTER . Я попробовал это

 int main() { setvbuf(stdin,NULL,_IONBF,0); getchar(); return 0; } 

Сравнивая это с прототипом setvbuf

 setvbuf ( FILE * stream, char * buffer, int mode, size_t size ); 

он должен установить stdin в небуферизованный режим.

Но все же getchar() продолжает ждать ENTER

Я видел похожие сообщения, подобные этому

Печать при чтении символов в C

которые предлагают альтернативные методы, чтобы сделать stdin небуферизованным. Но мне любопытно узнать, почему метод setvbuf не работает

Драйвер терминала ничего не возвращает, пока вы не нажмете возврат, даже если операция read() примет то, что уже существует.

Чтобы получить посимвольный ввод от терминала, вы должны вывести его из канонического режима в режим raw или cbreak, и для этого требуются разные операции. Взгляните на руководство POSIX на «Общий интерфейс терминала», как управлять терминалом. Или рассмотрите возможность использования библиотеки curses .

См. Также: Canonical vs non-canonical terminal input

Если вы пытаетесь это сделать под Linux или другой Unix-подобной системой, это терминал, который буферизует ввод и пропускает только целую строку. Вы можете использовать ncurses, чтобы обойти это:

 #include  int main() { initscr(); getch(); endwin(); return 0; } 

Компиляция с:

 gcc -o main main.c -lncurses 
Interesting Posts

Как обращаться с CORS с использованием JAX-RS с Джерси

Не удалось загрузить файл или сборку «System.Data.SQLite»

Не удалось выполнить идентификатор метода dex: не в : 65536

Как найти все перестановки данного слова в заданном тексте?

Программное обеспечение с поддержкой Richtext, которое может сохранять в уценке

Где находится Java в Mac OS X?

Как я могу работать с NET: ERR_CERT_AUTHORITY_INVALID в Chrome?

Безопасно избавиться от «У вас новая почта в / var / mail» на Mac?

Как установить -Dorg.apache.el.parser.COERCE_TO_ZERO = false программно

Boot Camp, Parallels, VirtualBox или Fusion?

Добавьте водяной знак в видео после объединения видео и аудио активов в один из Swift3 iOS

Возможно ли сбросить перечисление виртуальных com-портов FTDI, мы легко получаем сотни COM-портов в производственной среде

Что, если установить x.domain.com и y.domain.com на тот же IP-адрес в DNS?

Вопросительный знак (?) В атрибутах XML для Android

Как resize шрифта для опции выбора?

Давайте будем гением компьютера.