TTY(4)TTY(4)NAMEtty - general terminal interface
DESCRIPTION
This section describes both a particular special file, and the general
nature of the terminal interface.
The file /dev/tty is, in each process, a synonym for the control termi‐
nal associated with that process. It is useful for programs that wish
to be sure of writing messages on the terminal no matter how output has
been redirected. It can also be used for programs that demand a file
name for output, when typed output is desired and it is tiresome to
find out which terminal is currently in use.
As for terminals in general: all of the low-speed asynchronous communi‐
cations ports use the same general interface, no matter what hardware
is involved. The remainder of this section discusses the common fea‐
tures of the interface.
When a terminal file is opened, it causes the process to wait until a
connection is established. In practice user's programs seldom open
these files; they are opened by init and become a user's input and out‐
put file. The very first terminal file open in a process becomes the
control terminal for that process. The control terminal plays a spe‐
cial role in handling quit or interrupt signals, as discussed below.
The control terminal is inherited by a child process during a fork,
even if the control terminal is closed. The set of processes that thus
share a control terminal is called a process group; all members of a
process group receive certain signals together, see DEL below and
kill(2).
A terminal associated with one of these files ordinarily operates in
full-duplex mode. Characters may be typed at any time, even while out‐
put is occurring, and are only lost when the system's character input
buffers become completely choked, which is rare, or when the user has
accumulated the maximum allowed number of input characters that have
not yet been read by some program. Currently this limit is 256 charac‐
ters. When the input limit is reached all the saved characters are
thrown away without notice.
Normally, terminal input is processed in units of lines. This means
that a program attempting to read will be suspended until an entire
line has been typed. Also, no matter how many characters are requested
in the read call, at most one line will be returned. It is not however
necessary to read a whole line at once; any number of characters may be
requested in a read, even one, without losing information. There are
special modes, discussed below, that permit the program to read each
character as typed without waiting for a full line.
During input, erase and kill processing is normally done. By default,
the character `#' erases the last character typed, except that it will
not erase beyond the beginning of a line or an EOT. By default, the
character `@' kills the entire line up to the point where it was typed,
but not beyond an EOT. Both these characters operate on a keystroke
basis independently of any backspacing or tabbing that may have been
done. Either `@' or `#' may be entered literally by preceding it by
`\'; the erase or kill character remains, but the `\' disappears.
These two characters may be changed to others.
When desired, all upper-case letters are mapped into the corresponding
lower-case letter. The upper-case letter may be generated by preceding
it by `\'. In addition, the following escape sequences can be gener‐
ated on output and accepted on input:
for use
` \´
| \!
~ \^
{ \(
} \)
Certain ASCII control characters have special meaning. These charac‐
ters are not passed to a reading program except in raw mode where they
lose their special character. Also, it is possible to change these
characters from the default; see below.
EOT (Control-D) may be used to generate an end of file from a termi‐
nal. When an EOT is received, all the characters waiting to be
read are immediately passed to the program, without waiting for
a new-line, and the EOT is discarded. Thus if there are no
characters waiting, which is to say the EOT occurred at the
beginning of a line, zero characters will be passed back, and
this is the standard end-of-file indication.
DEL (Rubout) is not passed to a program but generates an interrupt
signal which is sent to all processes with the associated con‐
trol terminal. Normally each such process is forced to termi‐
nate, but arrangements may be made either to ignore the signal
or to receive a trap to an agreed-upon location. See signal(2).
FS (Control-\ or control-shift-L) generates the quit signal. Its
treatment is identical to the interrupt signal except that
unless a receiving process has made other arrangements it will
not only be terminated but a core image file will be generated.
DC3 (Control-S) delays all printing on the terminal until something
is typed in.
DC1 (Control-Q) restarts printing after DC3 without generating any
input to a program.
When the carrier signal from the dataset drops (usually because the
user has hung up his terminal) a hangup signal is sent to all processes
with the terminal as control terminal. Unless other arrangements have
been made, this signal causes the processes to terminate. If the
hangup signal is ignored, any read returns with an end-of-file indica‐
tion. Thus programs that read a terminal and test for end-of-file on
their input can terminate appropriately when hung up on.
When one or more characters are written, they are actually transmitted
to the terminal as soon as previously-written characters have finished
typing. Input characters are echoed by putting them in the output
queue as they arrive. When a process produces characters more rapidly
than they can be typed, it will be suspended when its output queue
exceeds some limit. When the queue has drained down to some threshold
the program is resumed. Even parity is always generated on output.
The EOT character is not transmitted (except in raw mode) to prevent
terminals that respond to it from hanging up.
Several ioctl(2) calls apply to terminals. Most of them use the fol‐
lowing structure, defined in <sgtty.h>:
struct sgttyb {
char sg_ispeed;
char sg_ospeed;
char sg_erase;
char sg_kill;
int sg_flags;
};
The sg_ispeed and sg_ospeed fields describe the input and output speeds
of the device according to the following table, which corresponds to
the DEC DH-11 interface. If other hardware is used, impossible speed
changes are ignored. Symbolic values in the table are as defined in
<sgtty.h>.
B0 0 (hang up dataphone)
B50 1 50 baud
B75 2 75 baud
B110 3 110 baud
B134 4 134.5 baud
B150 5 150 baud
B200 6 200 baud
B300 7 300 baud
B600 8 600 baud
B1200 9 1200 baud
B1800 10 1800 baud
B2400 11 2400 baud
B4800 12 4800 baud
B9600 13 9600 baud
EXTA 14 External A
EXTB 15 External B
In the current configuration, only 110, 150, 300 and 1200 baud are
really supported on dial-up lines. Code conversion and line control
required for IBM 2741's (134.5 baud) must be implemented by the user's
program. The half-duplex line discipline required for the 202 dataset
(1200 baud) is not supplied; full-duplex 212 datasets work fine.
The sg_erase and sg_kill fields of the argument structure specify the
erase and kill characters respectively. (Defaults are # and @.)
The sg_flags field of the argument structure contains several bits that
determine the system's treatment of the terminal:
ALLDELAY 0177400 Delay algorithm selection
BSDELAY 0100000 Select backspace delays (not implemented):
BS0 0
BS1 0100000
VTDELAY 0040000 Select form-feed and vertical-tab delays:
FF0 0
FF1 0100000
CRDELAY 0030000 Select carriage-return delays:
CR0 0
CR1 0010000
CR2 0020000
CR3 0030000
TBDELAY 0006000 Select tab delays:
TAB0 0
TAB1 0001000
TAB2 0004000
XTABS 0006000
NLDELAY 0001400 Select new-line delays:
NL0 0
NL1 0000400
NL2 0001000
NL3 0001400
EVENP 0000200 Even parity allowed on input (most terminals)
ODDP 0000100 Odd parity allowed on input
RAW 0000040 Raw mode: wake up on all characters, 8-bit interface
CRMOD 0000020 Map CR into LF; echo LF or CR as CR-LF
ECHO 0000010 Echo (full duplex)
LCASE 0000004 Map upper case to lower on input
CBREAK 0000002 Return each character as soon as typed
TANDEM 0000001 Automatic flow control
The delay bits specify how long transmission stops to allow for mechan‐
ical or other movement when certain characters are sent to the termi‐
nal. In all cases a value of 0 indicates no delay.
Backspace delays are currently ignored but might be used for Terminet
300's.
If a form-feed/vertical tab delay is specified, it lasts for about 2
seconds.
Carriage-return delay type 1 lasts about .08 seconds and is suitable
for the Terminet 300. Delay type 2 lasts about .16 seconds and is
suitable for the VT05 and the TI 700. Delay type 3 is unimplemented
and is 0.
New-line delay type 1 is dependent on the current column and is tuned
for Teletype model 37's. Type 2 is useful for the VT05 and is about
.10 seconds. Type 3 is unimplemented and is 0.
Tab delay type 1 is dependent on the amount of movement and is tuned to
the Teletype model 37. Type 3, called XTABS, is not a delay at all but
causes tabs to be replaced by the appropriate number of spaces on out‐
put.
Characters with the wrong parity, as determined by bits 200 and 100,
are ignored.
In raw mode, every character is passed immediately to the program with‐
out waiting until a full line has been typed. No erase or kill pro‐
cessing is done; the end-of-file indicator (EOT), the interrupt charac‐
ter (DEL) and the quit character (FS) are not treated specially. There
are no delays and no echoing, and no replacement of one character for
another; characters are a full 8 bits for both input and output (parity
is up to the program).
Mode 020 causes input carriage returns to be turned into new-lines;
input of either CR or LF causes LF-CR both to be echoed (for terminals
with a new-line function).
CBREAK is a sort of half-cooked (rare?) mode. Programs can read each
character as soon as typed, instead of waiting for a full line, but
quit and interrupt work, and output delays, case-translation, CRMOD,
XTABS, ECHO, and parity work normally. On the other hand there is no
erase or kill, and no special treatment of \ or EOT.
TANDEM mode causes the system to produce a stop character (default DC3)
whenever the input queue is in danger of overflowing, and a start char‐
acter (default DC1) when the input queue has drained sufficiently. It
is useful for flow control when the `terminal' is actually another
machine that obeys the conventions.
Several ioctl calls have the form:
#include <sgtty.h>
ioctl(fildes, code, arg)
struct sgttyb *arg;
The applicable codes are:
TIOCGETP
Fetch the parameters associated with the terminal, and store in
the pointed-to structure.
TIOCSETP
Set the parameters according to the pointed-to structure. The
interface delays until output is quiescent, then throws away any
unread characters, before changing the modes.
TIOCSETN
Set the parameters but do not delay or flush input. Switching
out of RAW or CBREAK mode may cause some garbage input.
With the following codes the arg is ignored.
TIOCEXCL
Set ``exclusive-use'' mode: no further opens are permitted until
the file has been closed.
TIOCNXCL
Turn off ``exclusive-use'' mode.
TIOCHPCL
When the file is closed for the last time, hang up the terminal.
This is useful when the line is associated with an ACU used to
place outgoing calls.
TIOCFLUSH
All characters waiting in input or output queues are flushed.
The following codes affect characters that are special to the terminal
interface. The argument is a pointer to the following structure,
defined in <sgtty.h>:
struct tchars {
char t_intrc; /* interrupt */
char t_quitc; /* quit */
char t_startc; /* start output */
char t_stopc; /* stop output */
char t_eofc; /* end-of-file */
char t_brkc; /* input delimiter (like nl) */
};
The default values for these characters are DEL, FS, DC1, DC3, EOT, and
-1. A character value of -1 eliminates the effect of that character.
The t_brkc character, by default -1, acts like a new-line in that it
terminates a `line,' is echoed, and is passed to the program. The
`stop' and `start' characters may be the same, to produce a toggle
effect. It is probably counterproductive to make other special charac‐
ters (including erase an kill) identical.
The calls are:
TIOCSETC
Change the various special characters to those given in the
structure.
TIOCSETP
Set the special characters to those given in the structure.
FILES
/dev/tty
/dev/tty*
/dev/console
SEE ALSOgetty(8), stty (1), signal(2), ioctl(2)BUGS
Half-duplex terminals are not supported.
The terminal handler has clearly entered the race for ever-greater com‐
plexity and generality. It's still not complex and general enough for
TENEX fans.
TTY(4)