All of lore.kernel.org
 help / color / mirror / Atom feed
From: Glynn Clements <glynn@gclements.plus.com>
To: Bastian Ruppert <ng@max01.eu>
Cc: linux-c-programming@vger.kernel.org
Subject: Re: line buffered stdin
Date: Mon, 11 Jan 2010 20:51:48 +0000	[thread overview]
Message-ID: <19275.36708.583271.381994@cerise.gclements.plus.com> (raw)
In-Reply-To: <4B4B5173.20504@max01.eu>


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@gclements.plus.com>

      parent reply	other threads:[~2010-01-11 20:51 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-11 16:27 line buffered stdin Bastian Ruppert
2010-01-11 16:36 ` Manish Katiyar
2010-01-11 19:09   ` ern0
2010-01-11 20:51 ` Glynn Clements [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=19275.36708.583271.381994@cerise.gclements.plus.com \
    --to=glynn@gclements.plus.com \
    --cc=linux-c-programming@vger.kernel.org \
    --cc=ng@max01.eu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.