setvbuf not able to make stdin unbuffered

The terminal driver doesn’t return anything until you hit return, even if the read() operation would accept what’s already there.

To get character-by-character input from a terminal, you have to get it out of canonical mode into raw or cbreak mode, and that requires different operations altogether. Take a look at the POSIX manual on ‘General Terminal Interface’ for how to control the terminal. Or consider using the curses library.

See also: Canonical vs non-canonical terminal input

Leave a Comment