Please refer to termios(3) manual page, under section “Canonical and noncanonical mode”.
Typically, the terminal (standard input) is in canonical mode; in this mode the kernel will buffer the input line before returning the input to the application. The hard-coded limit for Linux (N_TTY_BUF_SIZE
defined in ${linux_source_path}/include/linux/tty.h
) is set to 4096 allowing input of 4095 characters not counting the ending new line. You can also have a look at file ${linux_source_path}/drivers/tty/n_tty.c
, function n_tty_receive_buf_common()
and the comment above that.
In noncanonical mode there will by default be no buffering by kernel and the read(2) system call returns immediately once a single character of input is returned (key is pressed). You can manipulate the terminal settings to read a specified amount of characters or set a time-out for non-canonical mode, but then too the hard-coded limit is 4095 per the termios(3)
manual page (and the comment above the above mentioned n_tty_receive_buf_common()
).
Bash read
builtin command still works in non-canonical mode as can be demonstrated by the following:
IFS=$'\n' # Allow spaces and other white spaces.
stty -icanon # Disable canonical mode.
read line # Now we can read without inhibitions set by terminal.
stty icanon # Re-enable canonical mode (assuming it was enabled to begin with).
After this modification of adding stty -icanon
you can paste longer than 4096 character string and read it successfully using bash
built-in read
command (I successfully tried longer than 10000 characters).
If you put this in a file, i.e. make it a script, you can use strace
to see the system calls called, and you will see read(2)
called multiple times, each time returning a single character when you type input to it.