749 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			749 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.TH TTY 4
 | 
						|
.SH NAME
 | 
						|
tty, termios \- terminals
 | 
						|
.SH DESCRIPTION
 | 
						|
The
 | 
						|
.B tty
 | 
						|
driver family takes care of all user input and output.  It governs the
 | 
						|
keyboard, the console, the serial lines, and pseudo ttys.  Input on any of
 | 
						|
these devices undergoes "input processing", and output undergoes "output
 | 
						|
processing" according to the standard termios terminal interface.
 | 
						|
.SS "Input processing"
 | 
						|
Each terminal device has an input queue.  This queue is used to store
 | 
						|
preprocessed input characters, and to perform the backspacing and erase
 | 
						|
functions.  Some special characters like a newline make the contents of the
 | 
						|
queue available to a process reading from the terminal.  Characters up to
 | 
						|
and including the newline, or another so-called "line break", may be read by
 | 
						|
a process.  The process need not read all characters at once.  An input line
 | 
						|
may be read byte by byte if one wants to.  A line break just makes
 | 
						|
characters available for reading, thats all.
 | 
						|
.PP
 | 
						|
When data is made available depends on whether the tty is in canonical mode
 | 
						|
or not.  In canonical mode the terminal processes input line by line.  A
 | 
						|
line ends with a newline
 | 
						|
.RB ( NL ),
 | 
						|
end-of-file
 | 
						|
.RB ( EOF ),
 | 
						|
or end-of-line
 | 
						|
.RB ( EOL ).
 | 
						|
Characters that have not been delimited by such a line break may be erased
 | 
						|
one by one with the
 | 
						|
.B ERASE
 | 
						|
character or all at once with the
 | 
						|
.B KILL
 | 
						|
character.  Once a line break is typed the characters become available to a
 | 
						|
reading process and can no longer be erased.  Once read they are removed
 | 
						|
from the input queue.  Several lines may be gathered in the input queue if
 | 
						|
no reader is present to read them, but a new reader will only receive one
 | 
						|
line.  Two line breaks are never returned in one read call.  The input queue
 | 
						|
has a maximum length of
 | 
						|
.B MAX_CANON
 | 
						|
characters.  Any more characters are discarded.  One must use
 | 
						|
.B ERASE
 | 
						|
or
 | 
						|
.B KILL
 | 
						|
to make the terminal functioning again if the input queue fills up.  If
 | 
						|
nonblocking I/O is set then \-1 is returned with
 | 
						|
.B errno
 | 
						|
set to
 | 
						|
.B EAGAIN
 | 
						|
if the reader would otherwise be blocked.
 | 
						|
.PP
 | 
						|
In non-canonical mode (raw mode for short) all characters are immediately
 | 
						|
available to the reader in principle.  One may however tune the terminal to
 | 
						|
bursty input with the
 | 
						|
.B MIN
 | 
						|
and
 | 
						|
.B TIME
 | 
						|
parameters, see the raw I/O parameters section below.  In raw mode no
 | 
						|
characters are discarded if the input queue threatens to overflow if the
 | 
						|
device supports flow control.
 | 
						|
.SS "Output processing"
 | 
						|
Characters written to a terminal device may undergo output processing, which
 | 
						|
is usually just inserting a carriage returns before newlines.  A writer
 | 
						|
may return before all characters are output if the characters can be stored
 | 
						|
in the output buffers.  If not then the writer may be blocked until space is
 | 
						|
available.  If non-blocking I/O is set then only the count of the number of
 | 
						|
bytes that can be processed immediately is returned.  If no characters can
 | 
						|
be written at all then \-1 is returned with
 | 
						|
.B errno
 | 
						|
set to
 | 
						|
.BR EAGAIN .
 | 
						|
.SS "Special characters"
 | 
						|
Some characters have special functions in some of the terminal modes.  These
 | 
						|
characters are as follows, with the MINIX 3 defaults shown in parentheses:
 | 
						|
.TP 5
 | 
						|
.BR INTR " (^?)"
 | 
						|
Special input character that is recognized if
 | 
						|
.B ISIG
 | 
						|
is set.  (For
 | 
						|
.B ISIG
 | 
						|
and other flags see the various modes sections below.)  It causes a
 | 
						|
.B SIGINT
 | 
						|
signal to be sent to all processes in the terminal process group.  (See the
 | 
						|
section on session leaders below.)
 | 
						|
.TP
 | 
						|
.BR QUIT " (^\e)"
 | 
						|
Special input character if
 | 
						|
.B ISIG
 | 
						|
is set.  Causes a
 | 
						|
.B SIGQUIT
 | 
						|
signal to be sent to the terminal process group.
 | 
						|
.TP
 | 
						|
.BR ERASE " (^H)"
 | 
						|
Special input character if
 | 
						|
.B ICANON
 | 
						|
is set.  Erases the last character in the current line.
 | 
						|
.TP
 | 
						|
.BR KILL " (^U)"
 | 
						|
Special input character if
 | 
						|
.B ICANON
 | 
						|
is set.  Erases the entire line.
 | 
						|
.TP
 | 
						|
.BR EOF " (^D)"
 | 
						|
Special input character if
 | 
						|
.B ICANON
 | 
						|
is set.  It is a line break character that is not itself returned to a
 | 
						|
reader.  If EOF is typed with no input present then the read returns zero,
 | 
						|
which normally causes the reader to assume that end-of-file is reached.
 | 
						|
.TP
 | 
						|
.BR CR " (^M)"
 | 
						|
Special input character if
 | 
						|
.B IGNCR
 | 
						|
or
 | 
						|
.B ICRNL
 | 
						|
is set.  It is a carriage return ('\er').  If
 | 
						|
.B IGNCR
 | 
						|
is set then
 | 
						|
.B CR
 | 
						|
is discarded.  If
 | 
						|
.B ICRNL
 | 
						|
is set and
 | 
						|
.B IGNCR
 | 
						|
is not set then
 | 
						|
.B CR
 | 
						|
is changed into an
 | 
						|
.B NL
 | 
						|
and has the same function as
 | 
						|
.BR NL.
 | 
						|
.TP
 | 
						|
.BR NL " (^J)"
 | 
						|
Special input character if
 | 
						|
.B ICANON
 | 
						|
is set.  It is both a newline ('\en') and a line break.
 | 
						|
.br
 | 
						|
Special output character if
 | 
						|
.B OPOST
 | 
						|
and
 | 
						|
.B ONLCR
 | 
						|
are set.  A
 | 
						|
.B CR NL
 | 
						|
sequence is output instead of just
 | 
						|
.BR NL .
 | 
						|
(MINIX 3 specific, but almost mandatory on any UNIX-like system.)
 | 
						|
.TP
 | 
						|
.BR TAB " (^I)"
 | 
						|
Special character on output if
 | 
						|
.B OPOST
 | 
						|
and
 | 
						|
.B XTABS
 | 
						|
are set.  It is transformed into the number of spaces necessary to reach a
 | 
						|
column position that is a multiple of eight.  (Only needed for terminals
 | 
						|
without hardware tabs.)
 | 
						|
.TP
 | 
						|
.BR EOL " (undefined)"
 | 
						|
Special input character if
 | 
						|
.B ICANON
 | 
						|
is set.  It is an additional line break.
 | 
						|
.TP
 | 
						|
.BR SUSP " (^Z)"
 | 
						|
Special input character if job control is implemented and
 | 
						|
.B ISIG
 | 
						|
is set.  It causes a
 | 
						|
.B SIGTSTP
 | 
						|
signal to be send to the terminal process group.  (MINIX 3 does not have job
 | 
						|
control.)
 | 
						|
.TP
 | 
						|
.BR STOP " (^S)"
 | 
						|
Special input character if
 | 
						|
.B IXON
 | 
						|
is set.  It suspends terminal output and is then discarded.
 | 
						|
.TP
 | 
						|
.BR START " (^Q)"
 | 
						|
Special output character if
 | 
						|
.B IXON
 | 
						|
is set.  It starts terminal output if suspended and is then discarded.  If
 | 
						|
.B IXANY
 | 
						|
is also set then any other character also starts terminal output, but they
 | 
						|
are not discarded.
 | 
						|
.TP
 | 
						|
.BR REPRINT " (^R)"
 | 
						|
Special input character if
 | 
						|
.B IEXTEN
 | 
						|
and
 | 
						|
.B ECHO
 | 
						|
are set.  Reprints the input queue from the last line break onwards.  A
 | 
						|
reprint also happens automatically if the echoed input has been messed up by
 | 
						|
other output and
 | 
						|
.B ERASE
 | 
						|
is typed.
 | 
						|
.TP
 | 
						|
.BR LNEXT " (^V)"
 | 
						|
Special input character if
 | 
						|
.B IEXTEN
 | 
						|
is set.  It is the "literal next" character that causes the next character
 | 
						|
to be input without any special processing.
 | 
						|
.TP
 | 
						|
.BR DISCARD " (^O)"
 | 
						|
Special input character if
 | 
						|
.B IEXTEN
 | 
						|
is set.  Causes output to be discarded until it is typed again.  (Implemented
 | 
						|
only under Minix-vmd.)
 | 
						|
.PP
 | 
						|
All of these characters except
 | 
						|
.BR CR ,
 | 
						|
.B NL
 | 
						|
and
 | 
						|
.B TAB
 | 
						|
may be changed or disabled under MINIX 3.  (Changes to
 | 
						|
.B START
 | 
						|
and
 | 
						|
.B STOP
 | 
						|
may be ignored under other termios implementations.)  The
 | 
						|
.B REPRINT
 | 
						|
and
 | 
						|
.B LNEXT
 | 
						|
characters are MINIX 3 extensions that are commonly present in other
 | 
						|
implementations.  \s-2POSIX\s+2 is unclear on whether
 | 
						|
.BR IEXTEN,
 | 
						|
.BR IGNCR
 | 
						|
and
 | 
						|
.BR ICRNL
 | 
						|
should be active in non-canonical mode, but under MINIX 3 they are.
 | 
						|
.SS "Terminal attributes"
 | 
						|
The attributes of a terminal, such as whether the mode should be canonical or
 | 
						|
non-canonical, are controlled by routines that use the
 | 
						|
.B termios
 | 
						|
structure as defined in
 | 
						|
.BR <termios.h> :
 | 
						|
.PP
 | 
						|
.RS
 | 
						|
.nf
 | 
						|
.ta +4n +10n +15n
 | 
						|
struct termios {
 | 
						|
	tcflag_t	c_iflag;	/* input modes */
 | 
						|
	tcflag_t	c_oflag;	/* output modes */
 | 
						|
	tcflag_t	c_cflag;	/* control modes */
 | 
						|
	tcflag_t	c_lflag;	/* local modes */
 | 
						|
	speed_t	c_ispeed;	/* input speed */
 | 
						|
	speed_t	c_ospeed;	/* output speed */
 | 
						|
	cc_t	c_cc[NCCS];	/* control characters */
 | 
						|
};
 | 
						|
.fi
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
The types
 | 
						|
.BR tcflag ,
 | 
						|
.B speed_t
 | 
						|
and
 | 
						|
.B cc_t
 | 
						|
are defined in
 | 
						|
.B <termios.h>
 | 
						|
as unsigned integral types.
 | 
						|
.SS "Input Modes"
 | 
						|
The
 | 
						|
.B c_iflag
 | 
						|
field contains the following single bit flags that control input processing:
 | 
						|
.TP 5
 | 
						|
.B ICRNL
 | 
						|
Map
 | 
						|
.B CR
 | 
						|
to
 | 
						|
.B NL
 | 
						|
on input.
 | 
						|
.TP
 | 
						|
.B IGNCR
 | 
						|
Ignore
 | 
						|
.B CR
 | 
						|
on input.  This flag overrides
 | 
						|
.BR ICRNL .
 | 
						|
.TP
 | 
						|
.B INLCR
 | 
						|
Map
 | 
						|
.B NL
 | 
						|
to
 | 
						|
.B CR
 | 
						|
on input.  This is done after the
 | 
						|
.B IGNCR
 | 
						|
check.
 | 
						|
.TP
 | 
						|
.B IXON
 | 
						|
Enable start/stop output control.
 | 
						|
.TP
 | 
						|
.B IXOFF
 | 
						|
Enable start/stop input control.  (Not implemented.)
 | 
						|
.TP
 | 
						|
.B IXANY
 | 
						|
Allow any character to restart output.  (MINIX 3 specific.)
 | 
						|
.TP
 | 
						|
.B ISTRIP
 | 
						|
Strip characters to seven bits.
 | 
						|
.TP
 | 
						|
.B IGNPAR
 | 
						|
Ignore characters with parity errors.  (Not implemented.)
 | 
						|
.TP
 | 
						|
.B INPCK
 | 
						|
Enable input parity checking.  (Not implemented.)
 | 
						|
.TP
 | 
						|
.B PARMRK
 | 
						|
Mark parity errors by preceding the faulty character with '\e377', '\e0'.
 | 
						|
The character '\e377' is preceded by another '\e377' to avoid ambiguity.
 | 
						|
(Not implemented.)
 | 
						|
.TP
 | 
						|
.B BRKINT
 | 
						|
Send the signal
 | 
						|
.B SIGINT
 | 
						|
to the terminal process group when receiving a break condition.  (Not
 | 
						|
implemented.)
 | 
						|
.TP
 | 
						|
.B IGNBRK
 | 
						|
Ignore break condition.  If neither
 | 
						|
.B BRKINT
 | 
						|
or
 | 
						|
.B IGNBRK
 | 
						|
is set a break is input as a single '\e0', or if
 | 
						|
.B PARMRK
 | 
						|
is set as '\e377', '\e0', '\e0'.
 | 
						|
(Breaks are always ignored.)
 | 
						|
.TP
 | 
						|
.B SCANCODES
 | 
						|
Send input as keyboard scancodes rather than processed ASCII characters. This 
 | 
						|
flag only applies to consoles; to check whether the flag is supported use the
 | 
						|
.B tcgetattr
 | 
						|
function after setting it and test whether
 | 
						|
.B c_iflag
 | 
						|
still contains the
 | 
						|
.B SCANCODES
 | 
						|
flag. Scancodes are provided directly and without any processing. As a 
 | 
						|
consequence, the
 | 
						|
.B ISTRIP
 | 
						|
,
 | 
						|
.B IGNCR
 | 
						|
,
 | 
						|
.B ICRNL
 | 
						|
,
 | 
						|
.B INLCR
 | 
						|
,
 | 
						|
.B ICANON
 | 
						|
and
 | 
						|
.B IEXTEN
 | 
						|
flags no longer influence input if this flag is specified. However, they may
 | 
						|
still influence echoing if enabled.  (MINIX 3 specific.)
 | 
						|
.SS "Output Modes"
 | 
						|
The
 | 
						|
.B c_oflag
 | 
						|
field contains the following single bit flags that control output processing:
 | 
						|
.TP
 | 
						|
.B OPOST
 | 
						|
Perform output processing.  This flag is the "main switch" on output
 | 
						|
processing.  All other flags are MINIX 3 specific.
 | 
						|
.TP
 | 
						|
.B ONLCR
 | 
						|
Transform an
 | 
						|
.B NL
 | 
						|
to a
 | 
						|
.B CR NL
 | 
						|
sequence on output.  Note that a key labeled "RETURN" or "ENTER" usually
 | 
						|
sends a
 | 
						|
.BR CR .
 | 
						|
In line oriented mode this is normally transformed into
 | 
						|
.B NL
 | 
						|
by
 | 
						|
.BR ICRNL .
 | 
						|
.B NL
 | 
						|
is the normal UNIX line delimiter ('\en').  On output an
 | 
						|
.B NL
 | 
						|
is transformed into the
 | 
						|
.B CR NL
 | 
						|
sequence that is necessary to reach the first column of the next line.
 | 
						|
(This is a common output processing function for UNIX-like systems, but not
 | 
						|
always separately switchable by an
 | 
						|
.B ONLCR
 | 
						|
flag.)
 | 
						|
.TP
 | 
						|
.B XTABS
 | 
						|
Transform a
 | 
						|
.B TAB
 | 
						|
into the number of spaces necessary to reach a column position that is a
 | 
						|
multiple of eight.
 | 
						|
.TP
 | 
						|
.B ONOEOT
 | 
						|
Discard
 | 
						|
.B EOT
 | 
						|
(^D) characters.  (Minix-vmd only.)
 | 
						|
.SS "Control Modes"
 | 
						|
The
 | 
						|
.B c_cflag
 | 
						|
field contains the following single bit flags and bit field for basic
 | 
						|
hardware control:
 | 
						|
.TP
 | 
						|
.B CLOCAL
 | 
						|
Ignore modem status lines.
 | 
						|
.TP
 | 
						|
.B CREAD
 | 
						|
Enable receiver.  (The receiver is always enabled.)
 | 
						|
.TP
 | 
						|
.B CSIZE
 | 
						|
Number of bits per byte.
 | 
						|
.B CSIZE
 | 
						|
masks off the values
 | 
						|
.BR CS5 ,
 | 
						|
.BR CS6 ,
 | 
						|
.BR CS7
 | 
						|
and
 | 
						|
.BR CS8
 | 
						|
that indicate that 5, 6, 7 or 8 bits are used.
 | 
						|
.TP
 | 
						|
.B CSTOPB
 | 
						|
Send two stop bits instead of one.  Two stop bits are normally used at 110
 | 
						|
baud or less.
 | 
						|
.TP
 | 
						|
.B PARENB
 | 
						|
Enable parity generation.
 | 
						|
.TP
 | 
						|
.B PARODD
 | 
						|
Generate odd parity if parity is generated, otherwise even parity.
 | 
						|
.TP
 | 
						|
.B HUPCL
 | 
						|
Drop the modem control lines on the last close of the terminal line.  (Not
 | 
						|
implemented.)
 | 
						|
.SS "Local Modes"
 | 
						|
The
 | 
						|
.B c_lflag
 | 
						|
field contains the following single bit flags that control various functions:
 | 
						|
.TP
 | 
						|
.B ECHO
 | 
						|
Enable echoing of input characters.  Most input characters are echoed as
 | 
						|
they are.  Control characters are echoed as 
 | 
						|
.BI "^" X
 | 
						|
where
 | 
						|
.I X
 | 
						|
is the letter used to say that the control character is
 | 
						|
.BI CTRL\- X\fR.
 | 
						|
The
 | 
						|
.BR CR ,
 | 
						|
.BR NL
 | 
						|
and
 | 
						|
.BR TAB
 | 
						|
characters are echoed with their normal effect unless they are escaped by
 | 
						|
.BR LNEXT .
 | 
						|
.TP
 | 
						|
.B ECHOE
 | 
						|
If
 | 
						|
.B ICANON
 | 
						|
and
 | 
						|
.B ECHO
 | 
						|
are set then echo
 | 
						|
.B ERASE
 | 
						|
and
 | 
						|
.B KILL
 | 
						|
as one or more backspace-space-backspace sequences to wipe out the last
 | 
						|
character or the entire line, otherwise they are echoed as they are.
 | 
						|
.TP
 | 
						|
.B ECHOK
 | 
						|
If
 | 
						|
.B ICANON
 | 
						|
and
 | 
						|
.B ECHO
 | 
						|
are set and
 | 
						|
.B ECHOE
 | 
						|
is not set then output an
 | 
						|
.B NL
 | 
						|
after the
 | 
						|
.B KILL
 | 
						|
character.  (For hardcopy terminals it is best to unset
 | 
						|
.B ECHOE
 | 
						|
and to set
 | 
						|
.BR ECHOK .)
 | 
						|
.TP
 | 
						|
.B ECHONL
 | 
						|
Echo
 | 
						|
.B NL
 | 
						|
even if
 | 
						|
.B ECHO
 | 
						|
is not set, but
 | 
						|
.B ICANON
 | 
						|
is set.
 | 
						|
.TP
 | 
						|
.B ICANON
 | 
						|
Canonical input.  This enables line oriented input and erase and kill
 | 
						|
processing.
 | 
						|
.TP
 | 
						|
.B IEXTEN
 | 
						|
Enable implementation defined input extensions.
 | 
						|
.TP
 | 
						|
.B ISIG
 | 
						|
Enable the signal characters
 | 
						|
.BR INTR ,
 | 
						|
.BR QUIT
 | 
						|
and
 | 
						|
.BR SUSP .
 | 
						|
.TP
 | 
						|
.B NOFLSH
 | 
						|
Disable the flushing of the input and output queues that is normally done if
 | 
						|
a signal is sent.
 | 
						|
.TP
 | 
						|
.B TOSTOP
 | 
						|
Send a
 | 
						|
.B SIGTTOU
 | 
						|
signal if job control is implemented and a background process tries to
 | 
						|
write.  (MINIX 3 has no job control.)
 | 
						|
.SS "Input and output speed"
 | 
						|
The input and output speed are encoded into the
 | 
						|
.B c_ispeed
 | 
						|
and
 | 
						|
.B c_ospeed
 | 
						|
fields.
 | 
						|
.B <termios.h>
 | 
						|
defines the symbols
 | 
						|
.BR B0 ,
 | 
						|
.BR B50 ,
 | 
						|
.BR B75 ,
 | 
						|
.BR B110 ,
 | 
						|
.BR B134 ,
 | 
						|
.BR B150 ,
 | 
						|
.BR B200 ,
 | 
						|
.BR B300 ,
 | 
						|
.BR B600 ,
 | 
						|
.BR B1200 ,
 | 
						|
.BR B1800 ,
 | 
						|
.BR B2400 ,
 | 
						|
.BR B4800 ,
 | 
						|
.BR B9600 ,
 | 
						|
.BR B19200 ,
 | 
						|
.BR B38400 ,
 | 
						|
.BR B57600
 | 
						|
and
 | 
						|
.BR B115200
 | 
						|
as values used to indicate the given baud rates.  The zero baud rate,
 | 
						|
.BR B0 ,
 | 
						|
if used for the input speed causes the input speed to be equal to the
 | 
						|
output speed.  Setting the output speed to zero hangs up the line.  One
 | 
						|
should use the functions
 | 
						|
.BR cfgetispeed() ,
 | 
						|
.BR cfgetospeed() ,
 | 
						|
.BR cfsetispeed()
 | 
						|
and
 | 
						|
.BR cfsetospeed()
 | 
						|
to get or set a speed, because the
 | 
						|
.B c_ispeed
 | 
						|
and
 | 
						|
.B c_ospeed
 | 
						|
fields may not be visible under other implementations.  (The
 | 
						|
.B c_ispeed
 | 
						|
and
 | 
						|
.B c_ospeed
 | 
						|
fields and the
 | 
						|
.B B57600
 | 
						|
and
 | 
						|
.B B115200
 | 
						|
symbols are MINIX 3 specific.)
 | 
						|
.SS "Special characters"
 | 
						|
The
 | 
						|
.B c_cc
 | 
						|
array contains the special characters that can be modified.  The array has
 | 
						|
length
 | 
						|
.B NCCS
 | 
						|
and is subscripted by the symbols
 | 
						|
.BR VEOF ,
 | 
						|
.BR VEOL ,
 | 
						|
.BR VERASE ,
 | 
						|
.BR VINTR ,
 | 
						|
.BR VKILL ,
 | 
						|
.BR VMIN ,
 | 
						|
.BR VQUIT ,
 | 
						|
.BR VTIME ,
 | 
						|
.BR VSUSP ,
 | 
						|
.BR VSTART ,
 | 
						|
.BR VSTOP ,
 | 
						|
.BR VREPRINT ,
 | 
						|
.BR VLNEXT
 | 
						|
and
 | 
						|
.BR VDISCARD .
 | 
						|
All these symbols are defined in
 | 
						|
.BR <termios.h> .
 | 
						|
Some implementations may give the same values to the
 | 
						|
.B VMIN
 | 
						|
and
 | 
						|
.B VTIME
 | 
						|
subscripts and the
 | 
						|
.B VEOF
 | 
						|
and
 | 
						|
.B VEOL
 | 
						|
subscripts respectively, and may ignore changes to
 | 
						|
.B START
 | 
						|
and
 | 
						|
.BR STOP .
 | 
						|
(Under MINIX 3 all special characters have their own
 | 
						|
.I c_cc
 | 
						|
slot and can all be modified.)
 | 
						|
.SS "Raw I/O Parameters"
 | 
						|
The
 | 
						|
.B MIN
 | 
						|
and
 | 
						|
.B TIME
 | 
						|
parameters can be used to adjust a raw connection to bursty input.
 | 
						|
.B MIN
 | 
						|
represents a minimum number of bytes that must be received before a read
 | 
						|
call returns.
 | 
						|
.B TIME
 | 
						|
is a timer of 0.1 second granularity that can be used to time out a read.
 | 
						|
Setting either of these parameters to zero has special meaning, which leads
 | 
						|
to the following four possibilities:
 | 
						|
.TP 5
 | 
						|
.B "MIN > 0, TIME > 0"
 | 
						|
.B TIME
 | 
						|
is an inter-byte timer that is started (and restarted) when a byte is
 | 
						|
received.  A read succeeds when either the minimum number of characters
 | 
						|
is received or the timer expires.  Note that the timer starts
 | 
						|
.B after
 | 
						|
the first character, so the read returns at least one byte.
 | 
						|
.TP
 | 
						|
.B "MIN > 0, TIME = 0"
 | 
						|
Now the timer is disabled, and a reader blocks indefinitely until at least
 | 
						|
.B MIN
 | 
						|
characters are received.
 | 
						|
.TP
 | 
						|
.B "MIN = 0, TIME > 0"
 | 
						|
.B TIME
 | 
						|
is now a read timer that is started when a read is executed.  The read will
 | 
						|
return if the read timer expires or if at least one byte is input.  (Note
 | 
						|
that a value of zero may be returned to the reader.)
 | 
						|
.TP
 | 
						|
.B "MIN = 0, TIME = 0"
 | 
						|
The bytes currently available are returned.  Zero is returned if no bytes
 | 
						|
are available.
 | 
						|
.SS "User Level Functions"
 | 
						|
Termios attributes are set or examined, and special functions can be
 | 
						|
performed by using the functions described in
 | 
						|
.BR termios (3).
 | 
						|
.SS "Session Leaders and Process Groups"
 | 
						|
With the use of the
 | 
						|
.B setsid()
 | 
						|
function can a process become a session leader.  A session leader forms a
 | 
						|
process group with a process group id equal to the process id of the session
 | 
						|
leader.  If a session leader opens a terminal device file then this terminal
 | 
						|
becomes the controlling tty of the session leader.  Unless the terminal is
 | 
						|
already the controlling tty of another process, or unless the
 | 
						|
.B O_NOCTTY
 | 
						|
flag is used to prevent the allocation of a controlling tty.  The process
 | 
						|
group of the session leader is now remembered as the terminal process group
 | 
						|
for signals sent by the terminal driver.  All the children and grandchildren
 | 
						|
of the session leader inherit the controlling terminal and process group
 | 
						|
until they themselves use
 | 
						|
.BR setsid() .
 | 
						|
.PP
 | 
						|
The controlling tty becomes inaccessible to the children of the session
 | 
						|
leader when the session leader exits, and a hangup signal is sent to all
 | 
						|
the members of the process group.  The input and output queues are flushed
 | 
						|
on the last close of a terminal and all attributes are reset to the default
 | 
						|
state.
 | 
						|
.PP
 | 
						|
A special device
 | 
						|
.B /dev/tty
 | 
						|
is a synonym for the controlling tty of a process.  It allows a process to
 | 
						|
reach the terminal even when standard input, output and error are
 | 
						|
redirected.  Opening this device can also be used as a test to see if a
 | 
						|
process has a controlling tty or not.
 | 
						|
.PP
 | 
						|
For MINIX 3 a special write-only device
 | 
						|
.B /dev/log
 | 
						|
exists for processes that want to write messages to the system console.
 | 
						|
Unlike the console this device is still accessible when a session leader
 | 
						|
exits.
 | 
						|
.PP
 | 
						|
Minix-vmd also has a
 | 
						|
.B /dev/log
 | 
						|
device, but this device is read-write.  All messages written to the log
 | 
						|
device or to the console when X11 is active can be read from
 | 
						|
.BR /dev/log .
 | 
						|
The system tries to preserve the log buffer over a reboot so that panic
 | 
						|
messages reappear in the log if the system happens to crash.
 | 
						|
.SS "Pseudo Terminals"
 | 
						|
Pseudo ttys allow a process such as a remote login daemon to set up a
 | 
						|
terminal for a remote login session.  The login session uses a device like
 | 
						|
.B /dev/ttyp0
 | 
						|
for input and output, and the remote login daemon uses the device
 | 
						|
.B /dev/ptyp0
 | 
						|
to supply input to or take output from the login session and transfer this
 | 
						|
to or from the originating system.  So the character flow may be:  Local
 | 
						|
user input sent to the remote system is written to
 | 
						|
.B /dev/ptyp0
 | 
						|
by the remote login daemon, undergoes input processing and appears on
 | 
						|
.B /dev/ttyp0
 | 
						|
as input to the login session.  Output from the login session to
 | 
						|
.B /dev/ttyp0
 | 
						|
undergoes output processing, is read from
 | 
						|
.B /dev/ptyp0
 | 
						|
by the remote login daemon and is send over to the local system to be
 | 
						|
displayed for the user.  (So there are only four data streams to worry about
 | 
						|
in a pseudo terminal.)
 | 
						|
.PP
 | 
						|
A pseudo terminal can be allocated by trying to open all the controlling
 | 
						|
devices
 | 
						|
.BI /dev/pty nn
 | 
						|
one by one until it succeeds.  Further opens will fail once a pty is open.
 | 
						|
The process should now fork, the child should become session leader, open
 | 
						|
the tty side of the pty and start a login session.
 | 
						|
.PP
 | 
						|
If the tty side is eventually closed down then reads from the pty side will
 | 
						|
return zero and writes return \-1 with
 | 
						|
.B errno
 | 
						|
set to
 | 
						|
.BR EIO .
 | 
						|
If the pty side is closed first then a
 | 
						|
.B SIGHUP
 | 
						|
signal is sent to the session leader and further reads from the tty side
 | 
						|
return zero and writes return \-1 with
 | 
						|
.B errno
 | 
						|
set to
 | 
						|
.BR EIO .
 | 
						|
(Special note:  A line erase may cause up to three times the size of the
 | 
						|
tty input queue to be sent to the pty reader as backspace overstrikes.  Some
 | 
						|
of this output may get lost if the pty reader cannot accept it all at once
 | 
						|
in a single read call.)
 | 
						|
.SH FILES
 | 
						|
The list below shows all devices that MINIX 3 and Minix-vmd have.  Not all of
 | 
						|
these devices are configured in by default, as indicated by the numbers
 | 
						|
(i/j/k, l/m/n) that tell the minimum, default and maximum possible number of
 | 
						|
these devices for MINIX 3 (i/j/k) and Minix-vmd (l/m/n).
 | 
						|
.TP 20
 | 
						|
.B /dev/console
 | 
						|
System console.
 | 
						|
.TP
 | 
						|
.B /dev/ttyc[1-7]
 | 
						|
Virtual consoles.  (0/1/7, 0/1/7)
 | 
						|
.TP
 | 
						|
.BR /dev/log
 | 
						|
Console log device.
 | 
						|
.TP
 | 
						|
.B /dev/tty0[0-3]
 | 
						|
Serial lines.  (0/2/2, 4/4/4)
 | 
						|
.TP
 | 
						|
.B /dev/tty[p-w][0-f]
 | 
						|
Pseudo ttys.  (0/0/64, 1/32/128)
 | 
						|
.TP
 | 
						|
.B /dev/pty[p-w][0-f]
 | 
						|
Associated pseudo tty controllers.
 | 
						|
.SH "SEE ALSO"
 | 
						|
.BR stty (1),
 | 
						|
.BR termios (3),
 | 
						|
.BR setsid (2),
 | 
						|
.BR read (2),
 | 
						|
.BR write (2).
 | 
						|
.SH BUGS
 | 
						|
A fair number of flags are not implemented under MINIX 3 (yet).  Luckily they
 | 
						|
are very limited utility and only apply to RS-232, not to the user interface.
 | 
						|
.SH AUTHOR
 | 
						|
Kees J. Bot (kjb@cs.vu.nl)
 |