Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ tty(4) — AUX SR8.0

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

stty(1)

ioctl(2)

TTY(4)

NAME

tty − 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 terminal associated with the process group of that process, if any.  It is useful for programs or shell scripts 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 the name of a file for output, when typed output is desired and it is tiresome to find out what terminal is currently in use. 

As for terminals in general: all of the asynchronous communications ports use the same general interface, no matter what hardware is involved.  The remainder of this section discusses the common features of this interface. 

When a terminal file is opened, it normally causes the process to wait until a connection is established.  In practice, users’ programs seldom open these files; they are opened by start_sh or siologin and become a user’s standard input, output, and error files.  The very first terminal file opened by the process group leader of a terminal file not already associated with a process group becomes the control terminal for that process group.  The control terminal plays a special role in handling quit and interrupt signals, as discussed below.  The control terminal is inherited by a child process during a fork(2). A process can break this association by changing its process group using setpgrp(2).

A terminal associated with one of these files ordinarily operates in full-duplex mode.  Characters may be typed at any time, even while output is occurring, and are only lost when the system’s character input buffers become completely full, 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 characters.  When the input limit is reached, all the saved characters are thrown away without notice. 

Normally, terminal input is processed in units of lines.  A line is delimited by a new-line (ASCII LF) character or an end-of-file (ASCII EOT) character.  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. 

During input, erase and kill processing is normally done.  By default, the bakcspace character (CTRL/H) erases the last character typed, except that it will not erase beyond the beginning of the line.  By default, CTRL/X kills (deletes) the entire input line, and optionally outputs a new-line character.  Both these characters operate on a key-stroke basis, independently of any backspacing or tabbing that may have been done.  In this case the escape character is not read.  The erase and kill characters may be changed. 

Certain characters have special functions on input.  These functions and their default character values are summarized as follows:

INTR (CTRL/C or ASCII DEL) generates an interrupt signal which is sent to all processes with the associated control terminal.  Normally, each such process is forced to terminate, but arrangements may be made either to ignore the signal or to receive a trap to an agreed-upon location; see signal(2).

QUIT (CTRL/] or ASCII FS) generates a 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 (called core) will be created in the current working directory. 

ERASE CTRL/H erases the preceding character.  It will not erase beyond the start of a line, as delimited by a NL, EOF, or EOL character. 

KILL CTRL/X deletes the entire line, as delimited by a NL, EOF, or EOL character. 

EOF (CTRL/Z or ASCII EOT) may be used to generate an end-of-file from a terminal.  When received, all the characters waiting to be read are immediately passed to the program, without waiting for a new-line, and the EOF is discarded.  Thus, if there are no characters waiting, which is to say the EOF occurred at the beginning of a line, zero characters will be passed back, which is the standard end-of-file indication. 

NL (ASCII LF) is the normal line delimiter.  It can not be changed or escaped. 

STOP (CTRL/S or ASCII DC3) can be used to temporarily suspend output.  It is useful with CRT terminals to prevent output from disappearing before it can be read.  While output is suspended, STOP characters are ignored and not read. 

START (CTRL/Q or ASCII DC1) is used to resume output which has been suspended by a STOP character.  While output is not suspended, START characters are ignored and not read.  The start/stop characters can not be changed or escaped. 

The character values for INTR, QUIT, ERASE, KILL, and EOF may be changed to suit individual needs. 

When the carrier signal from the data-set drops, a hangup signal is sent to all processes that have this terminal as the control terminal.  Unless other arrangements have been made, this signal causes the processes to terminate.  If the hangup signal is ignored, any subsequent read returns with an end-of-file indication.  Thus programs that read a terminal and test for end-of-file can terminate appropriately when hung up on. 

When one or more characters are written, they are 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.  If 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. 

Several ioctl(2) system calls apply to terminal files. The primary calls use the following structure, defined in <termio.h>:

#define NCC     8
struct  termio {
        unsigned        short   c_iflag;        /∗ input modes ∗/
        unsigned        short   c_oflag;        /∗ output modes ∗/
        unsigned        short   c_cflag;        /∗ control modes ∗/
        unsigned        short   c_lflag;        /∗ local modes ∗/
        char            c_line;         /∗ line discipline ∗/
        unsigned        char    c_cc[NCC];      /∗ control chars ∗/
};

The special control characters are defined by the array c_cc. The relative positions and initial values for each function are as follows:

0       INTR    DEL
1       QUIT    FS
2       ERASE   #
3       KILL    @
4       EOF     EOT
5       EOL     NUL
6       reserved
7       reserved

The c_iflag field describes the basic terminal input control:

IGNPAR  0000004 Ignore characters with parity errors.
INPCK   0000020 Enable input parity check.
ISTRIP  0000040 Strip character.
ICRNL   0000400 Map CR to NL on input.
IXON    0002000 Enable start/stop output control.
IXOFF   0010000 Enable start/stop input control.

If IGNPAR is set, characters with other framing and parity errors are ignored. 

If INPCK is set, input parity checking is enabled.  If INPCK is not set, input parity checking is disabled.  This allows output parity generation without input parity errors. 

If ISTRIP is set, valid input characters are first stripped to 7-bits, otherwise all 8-bits are processed.  If ISTRIP is not set, a valid character of 0377 is read as 0377, 0377. 

If ICRNL is set, a received CR character is translated into a NL character. 

If IXON is set, start/stop output control is enabled.  A received STOP character will suspend output and a received START character will restart output.  All start/stop characters are ignored and not read. 

If IXOFF is set, the system will transmit START/STOP characters when the input queue is nearly empty/full. 

The initial input control value is all bits clear. 

The c_oflag field specifies the system treatment of output:

OPOST   0000001 Postprocess output.
ONLCR   0000004 Map NL to CR-NL on output.
NLDLY   0000400 Select new-line delays:
NL0     0
NL1     0000400
CRDLY   0003000 Select carriage-return delays:

If OPOST is set, output characters are post-processed as indicated by the remaining flags, otherwise characters are transmitted without change. 

If OLCUC is set, a lower-case alphabetic character is transmitted as the corresponding upper-case character.  This function is often used in conjunction with IUCLC. 

If ONLCR is set, the NL character is transmitted as the CR-NL character pair.  If OCRNL is set, the CR character is transmitted as the NL character.  If ONOCR is set, no CR character is transmitted when at column 0 (first position).  If ONLRET is set, the NL character is assumed to do the carriage-return function; the column pointer will be set to 0 and the delays specified for CR will be used.  Otherwise the NL character is assumed to do just the line-feed function; the column pointer will remain unchanged.  The column pointer is also set to 0 if the CR character is actually transmitted. 

The delay bits specify how long transmission stops to allow for mechanical or other movement when certain characters are sent to the terminal.  In all cases a value of 0 indicates no delay.  If OFILL is set, fill characters will be transmitted for delay instead of a timed delay.  This is useful for high baud rate terminals which need only a minimal delay.  If OFDEL is set, the fill character is DEL, otherwise NUL. 

If a form-feed or vertical-tab delay is specified, it lasts for about 2 seconds. 

New-line delay lasts about 0.10 seconds.  If ONLRET is set, the carriage-return delays are used instead of the new-line delays.  If OFILL is set, two fill characters will be transmitted. 

Carriage-return delay type 1 is dependent on the current column position, type 2 is about 0.10 seconds, and type 3 is about 0.15 seconds.  If OFILL is set, delay type 1 transmits two fill characters, and type 2 four fill characters. 

Horizontal-tab delay type 1 is dependent on the current column position.  Type 2 is about 0.10 seconds.  Type 3 specifies that tabs are to be expanded into spaces.  If OFILL is set, two fill characters will be transmitted for any delay. 

Backspace delay lasts about 0.05 seconds.  If OFILL is set, one fill character will be transmitted. 

The actual delays depend on line speed and system load. 

The initial output control value is all bits clear. 

The c_cflag field describes the hardware control of the terminal:

CBAUD   0000017 Baud rate:
B0      0       Hang up
B50     0000001 50 baud
B75     0000002 75 baud
B110    0000003 110 baud
B134    0000004 134.5 baud
B300    0000007 300 baud
B600    0000010 600 baud
B1200   0000011 1200 baud
B1800   0000012 1800 baud
B2400   0000013 2400 baud
B4800   0000014 4800 baud
B9600   0000015 9600 baud
EXTA    0000016 External A
EXTB    0000017 External B
CSIZE   0000060 Character size:
CS5     0       5 bits
CS6     0000020 6 bits
CS7     0000040 7 bits
CS8     0000060 8 bits
CSTOPB  0000100 Send two stop bits, else one.
CREAD   0000200 Enable receiver.
PARENB  0000400 Parity enable.
PARODD  0001000 Odd parity, else even.
HUPCL   0002000 Hang up on last close.

The CBAUD bits specify the baud rate.  The zero baud rate, B0, is used to hang up the connection.  If B0 is specified, the data-terminal-ready signal will not be asserted.  Normally, this will disconnect the line.  For any particular hardware, impossible speed changes are ignored. 

The CSIZE bits specify the character size in bits for both transmission and reception.  This size does not include the parity bit, if any.  If CSTOPB is set, two stop bits are used, otherwise one stop bit.  For example, at 110 baud, two stops bits are required. 

If PARENB is set, parity generation and detection is enabled and a parity bit is added to each character.  If parity is enabled, the PARODD flag specifies odd parity if set, otherwise even parity is used. 

If CREAD is set, the receiver is enabled.  Otherwise no characters will be received. 

If HUPCL is set, the line will be disconnected when the last process with the line open closes it or terminates.  That is, the data-terminal-ready signal will not be asserted. 

If CLOCAL is set, the line is assumed to be a local, direct connection with no modem control.  Otherwise modem control is assumed. 

The initial hardware control value after open is B300, CS8, CREAD, HUPCL. 

The c_lflag field of the argument structure is used by the line discipline to control terminal functions.  The basic line discipline (0) provides the following:

ISIG    0000001 Enable signals.
ICANON  0000002 Canonical input (erase and kill processing).
ECHO    0000010 Enable echo.
ECHOE   0000020 Echo erase character as BS-SP-BS.
ECHOK   0000040 Echo NL after kill character.

If ISIG is set, each input character is checked against the special control characters INTR and QUIT.  If an input character matches one of these control characters, the function associated with that character is performed.  If ISIG is not set, no checking is done.  Thus these special input functions are possible only if ISIG is set.  These functions may be disabled individually by changing the value of the control character to an unlikely or impossible value (e.g. 0377). 

If ICANON is set, canonical processing is enabled.  This enables the erase and kill edit functions, and the assembly of input characters into lines delimited by NL, EOF, and EOL.  If ICANON is not set, read requests are satisfied directly from the input queue.  A read will not be satisfied until at least MIN characters have been received or the timeout value TIME has expired.  This allows fast bursts of input to be read efficiently while still allowing single character input.  The MIN and TIME values are stored in the position for the EOF and EOL characters respectively.  The time value represents tenths of seconds. 

If XCASE is set, and if ICANON is set, an upper-case letter is accepted on input by preceding it with a \ character, and is output preceded by a \ character.  In this mode, the following escape sequences are generated on output and accepted on input:

for: use:

` \´

│ \! 

~ \^

{ \(

} \)

\ \\

For example, A is input as \a, \n as \\n, and \N as \\\n. 

If ECHO is set, characters are echoed as received. 

When ICANON is set, the following echo functions are possible.  If ECHO and ECHOE are set, the erase character is echoed as ASCII BS SP BS, which will clear the last character from a CRT screen.  If ECHOE is set and ECHO is not set, the erase character is echoed as ASCII SP BS.  If ECHOK is set, the NL character will be echoed after the kill character to emphasize that the line will be deleted.  Note that an escape character preceding the erase or kill character removes any special function.  If ECHONL is set, the NL character will be echoed even if ECHO is not set.  This is useful for terminals set to local echo (so-called half duplex).  Unless escaped, the EOF character is not echoed.  Because EOT is the default EOF character, this prevents terminals that respond to EOT from hanging up. 

If NOFLSH is set, the normal flush of the input and output queues associated with the quit and interrupt characters will not be done. 

The initial line-discipline control value is all bits clear. 

The primary ioctl(2) system calls have the form:

ioctl (fildes, command, arg)
struct termio ∗arg;

The commands using this form are:

TCGETA Get the parameters associated with the terminal and store in the termio structure referenced by arg. 

TCSETA Set the parameters associated with the terminal from the structure referenced by arg.  The change is immediate. 

TCSETAW Wait for the output to drain before setting the new parameters.  This form should be used when changing parameters that will affect output. 

TCSETAF Wait for the output to drain, then flush the input queue and set the new parameters. 

Additional ioctl(2) calls have the form:

ioctl (fildes, command, arg)
int arg;

The commands using this form are:

TCSBRK Wait for the output to drain.  If arg is 0, then send a break (zero bits for 0.25 seconds). 

NOTE TO AUX USERS

For compatibility with UNIX version 7, AUX supports the TIOCGETP, TIOCSETP, and TIOCSETN commands to ioctl(2).  These commands take a pointer to the structure sgyytb as defined in /usr/include/sgtty.h.  AUx also supports TIOCHPCL to set the hangup-on-close option. 

FILES

/dev/tty
/dev/tty∗
/dev/console

SEE ALSO

stty(1), ioctl(2). 

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026