Re: line buffered stdin

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


Bastian Ruppert wrote:

> under Linux stdin is line buffered,

More precisely, it's line buffered if stdin is a tty, fully-buffered
otherwise.

> that means you can read one byte with
> following statement:
> 
> read(0,&myvar,1);
> 
> You get the byte after typing one or more chars AND return.
> 
> But i need this function to return after every char entered in stdin.
> 
> Is there a function that reads stdin without line buffering?

User-space buffering of a stream (i.e. a "FILE *") can be controlled
with setvbuf() (or the other functions described in the setvbuf(3)
manpage).

However, the terminal driver also performs line-buffering by default
(so that you can edit the current line with Backspace, Ctrl-W,
Ctrl-U). This can be disabled with tcsetattr() (see ern0's reply for
details), although this also disables the use of Ctrl-D to generate
EOF.

> Is it possible to disable the linebuffer or to reduce the buffersize to one?
> Does this kind of manupilation have consequences for the hole system or 
> just for the app doing this?

setvbuf() only applies to a specific process. tcsetattr() affects the
terminal device, so you must restore the state upon termination (both
normal termination via exit() or return from main(), and abnormal
termination via a signal), upon suspension (i.e. SIGTSTP; you can't
catch SIGSTOP), or if you invoke a child process (via e.g. system())
which might need to use the terminal.

-- 
Glynn Clements <glynn@xxxxxxxxxxxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

Add to Google Powered by Linux