Skip to contentSkip to conversation

line buffered stdin

DISCUSSION Bastian Ruppert 4 participants 4 messages Jan 11, 2010

lore
Share & tools
lore
#0 lore raw

Hello,

under Linux stdin is line buffered, 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?

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?

Any Ideas are very welcome,
thank you.

Regards
Bastian.

#1 lore raw
Quoted 7 lines · Bastian Ruppert

Hello,

under Linux stdin is line buffered, that means you can read one byte with following statement:

read(0,&myvar,1);

Quoted 7 lines

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?

Is it possible to disable the linebuffer or to reduce the buffersize to one?

First two links in google search.

http://www.linux.org/docs/ldp/howto/NCURSES-Programming-HOWTO/init.html
http://www.flipcode.com/archives/_kbhit_for_Linux.shtml

Quoted 16 lines

Does this kind of manupilation have consequences for the hole system or just for
the app
doing this?

Any Ideas are very welcome,
thank you.

Regards
Bastian.
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Signature · 9 lines
Thanks -
Manish
==================================
[$\*.^ -- I miss being one of them
==================================
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#2 lore raw
Quoted 1 line

Is there a function that reads stdin without line buffering?

You should set some terminal attr:

  termios oldt;
  [...]
  tcgetattr(STDIN_FILENO,&oldt);
  termios newt = oldt;
  newt.c_lflag &= (~ICANON & ~ECHO);
  tcsetattr(STDIN_FILENO,TCSANOW,&newt);

and restore the old state when you're done:

  tcsetattr(STDIN_FILENO,TCSANOW,&oldt);

If you interrupt your program, you will see no echo, which is annoying. Type - blind mode - at the shell prompt: "reset" (don't worry, it only resets the terminal).

Gnome-terminal also clears the scrollback buffer upon "reset".

Signature · 2 lines
ern0.scene.plus4.amiga.code.muzak
Haben Sie Fragen?
#3 lore raw
In reply to Bastian Ruppert
Quoted 1 line · Bastian Ruppert

under Linux stdin is line buffered,

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

Quoted 10 lines

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.

Quoted 3 lines

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.

Signature · 1 line
Glynn Clements <[email protected]>