Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

stty(1)

fork(2)

ioctl(2)

setpgrp(2)

signal(2)

TERMIO(7)                            SysV                            TERMIO(7)



NAME
     termio - general terminal interface

DESCRIPTION
     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 terminal files; they are opened by getty 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, new input 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, an end-of-file (ASCII EOT)
     character, or an end-of-line 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,
     Control-h erases the last character typed, except that it will not erase
     beyond the beginning of the line.  By default, Control-u 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.  Both the erase and kill
     characters may be entered literally by preceding them with the escape
     character (\).  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    (Control-c) 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    (Control-| or ASCII FS) generates a quit signal.  Its treatment
             is identical to the interrupt signal.

     ERASE   (Control-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    (Control-u) deletes the entire line, as delimited by a NL, EOF,
             or EOL character.

     EOF     (Control-d 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.

     EOL     (ASCII NUL) is an additional line delimiter, like NL.  It is not
             normally used.

     STOP    (Control-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   (Control-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, SWTCH, ERASE, KILL, EOF, and EOL may
     be changed to suit individual tastes.  The ERASE, KILL, and EOF
     characters may be escaped by a preceding \ character, in which case no
     special function is done.

     When the carrier signal from the data-set drops, a hang-up 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 hang-up 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   VINTR    DEL
          1   VQUIT    FS
          2   VERASE   #
          3   VKILL    @
          4   VEOF     EOT
          5   VEOL     NUL
          6   reserved
          7   SWTCH

     The c_iflag field describes the basic terminal input control:

          IGNBRK  0000001  Ignore break condition.
          BRKINT  0000002  Signal interrupt on break.
          IGNPAR  0000004  Ignore characters with parity errors.
          PARMRK  0000010  Mark parity errors.
          INPCK   0000020  Enable input parity check.
          ISTRIP  0000040  Strip character.
          INLCR   0000100  Map NL to CR on input.
          IGNCR   0000200  Ignore CR.
          ICRNL   0000400  Map CR to NL on input.
          IUCLC   0001000  Map upper-case to lower-case on input.
          IXON    0002000  Enable start/stop output control.
          IXANY   0004000  Enable any character to restart output.
          IXOFF   0010000  Enable start/stop input control.

     If IGNBRK is set, the break condition (a character framing error with
     data all zeros) is ignored, that is, not put on the input queue and
     therefore not read by any process.  Otherwise if BRKINT is set, the break
     condition will generate an interrupt signal and flush both the input and
     output queues.  If IGNPAR is set, characters with other framing and
     parity errors are ignored.

     If PARMRK is set, a character with a framing or parity error which is not
     ignored is read as the three-character sequence:  0377, 0, X, where X is
     the data of the character received in error.  To avoid ambiguity in this
     case, if ISTRIP is not set, a valid character of 0377 is read as 0377,
     0377.  If PARMRK is not set, a framing or parity error which is not
     ignored is read as the character NUL (0).

     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 INLCR is set, a received NL character is translated into a CR
     character.  If IGNCR is set, a received CR character is ignored (not
     read).  Otherwise if ICRNL is set, a received CR character is translated
     into a NL character.

     If IUCLC is set, a received upper-case alphabetic character is translated
     into the corresponding lower-case 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 IXANY is
     set, any input character, will restart output which has been suspended.

     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 ICRNL, ISTRIP.

     The c_oflag field specifies the system treatment of output:

          OPOST   0000001  Postprocess output.
          OLCUC   0000002  Map lower case to upper on output.
          ONLCR   0000004  Map NL to CR-NL on output.
          OCRNL   0000010  Map CR to NL on output.
          ONOCR   0000020  No CR output at column 0.
          ONLRET  0000040  NL performs CR function.
          OFILL   0000100  Use fill characters for delay.
          OFDEL   0000200  Fill is DEL, else NUL.
          NLDLY   0000400  Select new-line delays:
          NL0     0
          NL1     0000400
          CRDLY   0003000  Select carriage-return delays:
          CR0     0
          CR1     0001000
          CR2     0002000
          CR3     0003000
          TABDLY  0014000  Select horizontal-tab delays:
          TAB0    0
          TAB1    0004000
          TAB2    0010000
          TAB3    0014000  Expand tabs to spaces.
          BSDLY   0020000  Select backspace delays:
          BS0     0
          BS1     0020000
          VTDLY   0040000  Select vertical-tab delays:
          VT0     0
          VT1     0040000
          FFDLY   0100000  Select form-feed delays:
          FF0     0
          FF1     0100000

     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 OPOST, ONLCR.

     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 baud
          B150    0000005  150 baud
          B200    0000006  200 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
          B19200  0000016 19200 baud
          EXTA    0000016  External A
          B38400  0000017  38400 baud
          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.
          CLOCAL  0004000  Local line, else dial-up.
          RCV1EN  0010000
          XMT1EN  0020000
          LOBLK   0040000  Block layer output.

     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.

     If LOBLK is set, the output of a job control layer will be blocked when
     it is not the current layer.  Otherwise the output generated by that
     layer will be multiplexed onto the current layer.

     The initial hardware control value after open is B9600, CS8, CREAD

     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).
          XCASE   0000004  Canonical upper/lower presentation (not supported).
          ECHO    0000010  Enable echo.
          ECHOE   0000020  Echo erase character as BS-SP-BS.
          ECHOK   0000040  Echo NL after kill character.
          ECHONL  0000100  Echo NL.
          NOFLSH  0000200  Disable flush after interrupt or quit.

     If ISIG is set, each input character is checked against the special
     control characters INTR, SWTCH, 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 between characters.  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 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, switch, and interrupt characters will not be
     done.

     The initial line-discipline control value is ISIG, ICANON, ECHO, ECHOE,
     ECHOK.

     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).

          TCXONC    Start/stop control.  If arg is 0, suspend output; if 1,
                    restart suspended output.

          TCFLSH    If arg is 0, flush the input queue; if 1, flush the output
                    queue; if 2, flush both the input and output queues.

FILES
     /dev/tty*

SEE ALSO
     stty(1) in Using Your SysV Environment.
     fork(2), ioctl(2), setpgrp(2), signal(2) in the SysV Programmer's
     Reference.

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