Table of Contents

NAME

termio, termios - general terminal interfaces

SYNOPSIS

#include <termios.h>

ioctl (int fildes, int request, struct termios *arg);

ioctl (int fildes, int request, int arg);

#include <termio.h>

ioctl (int fildes, int request, struct termio *arg);

DESCRIPTION

All of the asynchronous communications ports use the same general interface, no matter what hardware is involved. The user interface to this functionality is via the ioctl calls described below, or the POSIX termios interface described in termios(3t). The remainder of this section discusses the common features of the terminal subsystem which are relevant to both of these interfaces.

Recent changes
The termio and termios structures have been changed to support bit rates of greater than 38400 bps. Each of these structures has two new members c_ospeed and c_ispeed which store the output and input bit rates, respectively. They replace the CBAUD and CIBAUD fields of the c_cflag member. CBAUD and CIBAUD should no longer be modified or examined by applications. (Because no current SGI hardware supports setting input and output to different rates, c_ispeed is currently unsupported. Applications should either not modify it, or should set it to the same value as c_ospeed.)

Unlike CBAUD and CIBAUD, c_ospeed and c_ispeed encode bit rates as plain integers. To set a bit rate of 38400 bits per second, an application would set c_ospeed to the integer value 38400. For convenience, macros such as B38400 have been provided for several common bit rates.

Note that the capabilities of various serial port hardware differ; many still do not support rates greater than 38400 bps (see serial(7) for more information on different serial port types.) Applications therefore need to check the return values of library calls that attempt to set bit rates (such as ioctl described here) , because the calls may now fail in more situations than before.

Controlling Terminal
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 the system and become a user's standard input, output and error files. The very first terminal file opened by the session leader which is not already associated with a session becomes the controlling terminal for the session.

If a process does not wish to acquire the terminal as a controlling terminal (as is the case with many daemons that open /dev/console), the process should add the O_NOCTTY flag into the second argument bitmask to open(2).

The controlling terminal is inherited by the child process during a fork(2). A process can break this association by changing its session using setsid(2). (Currently, this also happens if a process issues a System V setpgrp() or BSDsetpgrp(mypid, 0). This provides backward compatibility with SVR3 and BSD4.3).

When a session leader that has a controlling terminal exits, the SIGHUP signal will be sent to each process in the foreground process group of the controlling terminal and the controlling terminal will be disassociated from the current session. This allows the terminal to be acquired by a new session leader. Subsequent access to the terminal by other processes in the earlier session will fail, returning the error code EIO.

Session Management (Job Control)
A controlling terminal will designate one of the process groups in the session associated with it as the foreground process group. All other process groups in the session are designated as background process groups. The foreground process group plays a special role in handling signal-generating input characters, as discussed below. By default, when a controlling terminal is allocated, the controlling process's process group is assigned as the foreground process group.

Background process groups in the controlling process's session are subject to a job control line discipline when they attempt to access their controlling terminal. Typically, they will be sent signals that will cause them to stop, unless they have made other arrangements. An exception is made for members of orphaned process groups. When a member of an orphaned process group attempts to access its controlling terminal, an error is returned since there is no process to continue it should it stop.

If a member of a background process group attempts to read its controlling terminal, its process group will be sent a SIGTTIN signal, which will normally cause the members of that process group to stop. If, however, the process is ignoring or holding SIGTTIN, or is a member of an orphaned process group, the read will fail with errno set to EIO, and no signal will be sent.

If a member of a background process group attempts to write to its controlling terminal and the TOSTOP bit is set in the c_lflag field (see below), its process group will be sent a SIGTTOU signal, which will normally cause the members of that process group to stop. If, however, the process is ignoring or holding SIGTTOU, the write will succeed. If the process is not ignoring or holding SIGTTOU and is a member of an orphaned process group, the write will fail with errno set to EIO, and no signal will be sent.

If a member of a background process group attempts to invoke an ioctl() on its controlling terminal, and that ioctl() will modify terminal parameters (e.g. TCSETA, TCSETAW, TCSETAF, or TIOCSPGRP), and the TOSTOP bit is set in the c_lflag field, its process group will be sent a SIGTTOU signal, which will normally cause the members of that process group to stop. If, however, the process is ignoring or holding SIGTTOU, the ioctl() will succeed. If the process is not ignoring or holding SIGTTOU and is a member of an orphaned process group, the ioctl() will fail with errno set to EIO, and no signal will be sent.

Input Processing and Reading Characters
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 {MAX_CANON} characters (see pathconf(2)). When the input limit is reached, the buffer is flushed and all the saved characters are thrown away without notice.

Canonical Mode Input Processing
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. The ERASE character (Control-H) erases the last character typed. The WERASE character (Control-W) erases the last ``word'' typed in the current input line (but not any preceding spaces or tabs). A ``word'' is defined as a sequence of non-blank characters, with tabs counted as blanks. Neither ERASE or WERASE will erase beyond the beginning of the line. The KILL character (Control-U) kills (deletes) the entire input line, and optionally outputs a new-line character. All these characters operate on a key-stroke basis, independently of any backspacing or tabbing that may have been done. The REPRINT character (Control-R) prints a newline followed by all unread characters. The characters are reprinted as if they were being echoed; consequently if the ECHO flag is not set (see below), they are not printed. The ERASE, WERASE, KILL and REPRINT characters may be changed.

Non-canonical Mode Input Processing
In non-canonical mode input processing, input characters are not assembled into lines, and erase and kill processing does not occur. The

MIN and TIME values are used to determine how to process the characters received.

MIN represents the minimum number of characters that should be received when the read is satisfied (i.e., when the characters are returned to the user). TIME is a timer of 0.10-second granularity that is used to timeout bursty and short-term data transmissions. The four possible values for MIN and TIME and their interactions are described below.

Case A: MIN > 0, TIME > 0
In this case, TIME serves as an intercharacter timer and is activated after the first character is received. Since it is an intercharacter timer, it is reset after a character is received. The interaction between MIN and TIME is as follows: as soon as one character is received, the intercharacter timer is started. If MIN characters are received before the intercharacter timer expires (note that the timer is reset upon receipt of each character), the read is satisfied. If the timer expires before MIN characters are received, the characters received to that point are returned to the user. Note that if TIME expires, at least one character will be returned because the timer would not have been enabled unless a character was received. In this case (MIN > 0, TIME > 0), the read sleeps until the MIN and TIME mechanisms are activated by the receipt of the first character. If the number of characters read is less than the number of characters available, the timer is not reactivated and the subsequent read is satisfied immediately.

Case B: MIN > 0, TIME = 0
In this case, since the value of TIME is zero, the timer plays no role and only MIN is significant. A pending read is not satisfied until MIN characters are received (the pending read sleeps until MIN characters are received). A program that uses this case to read record based terminal I/O may block indefinitely in the read operation.

Case C: MIN = 0, TIME > 0
In this case, since MIN = 0, TIME no longer represents an intercharacter timer: it now serves as a read timer that is activated as soon as a read is done. A read is satisfied as soon as a single character is received or the read timer expires. Note that, in this case, if the timer expires, no character is returned. If the timer does not expire, the only way the read can be satisfied is if a character is received. In this case, the read will not block indefinitely waiting for a character; if no character is received within TIME*.10 seconds after the read is initiated, the read returns with zero characters.

Case D: MIN = 0, TIME = 0
In this case, return is immediate. The minimum of either the number of characters requested or the number of characters currently available is returned without waiting for more characters to be input.

Writing Characters
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.

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

INTR
(Typically, rubout or ASCII DEL) generates an interrupt signal SIGINT which is sent to all foreground processes with the associated controlling 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
(Typically, control-\ or ASCII FS) generates a quit signal SIGQUIT. 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
(Typically, control-H or backspace) erases the preceding character. It will not erase beyond the start of a line, as delimited by a NL, EOF, EOL, or EOL2 character.

KILL
(Typically, control-U) deletes the entire line, as delimited by a NL, EOF, EOL, or EOL2 character.

EOF
(Typically, 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 endof-file indication.

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

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

EOL2
is another additional line delimiter.

STOP
(Typically, 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
(Typically, 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 in LDISC0 (see ``Termio Structure'' below).

The following characters have special functions on input when the POSIX termios interface is used or when the System V termio interface is used and the line discipline is set to the default of LDISC1 (see ``Termio Structure'' below). These functions and their default character values are summarized as follows:

SUSP
(Control-Z or ASCII SUB) generates a SIGTSTP signal which stops all processes in the foreground process group for that terminal.

DSUSP
(Control-Y or ASCII EM) generates a SIGTSTP signal as SUSP does, but the signal is sent when a process in the foreground process group attempts to read the DSUSP character, rather than when it is typed.

LNEXT
(Control-V or ASCII SYN) causes the next character input to treated literally.

WERASE
(Control-W or ASCII ETB) erases the preceding white spacedelimited word. It will not erase beyond the start of a line, as delimited by a NL, EOF, EOL, or EOL2 character.

REPRINT
(Control-R or ASCII DC2) reprints all characters, preceded by a newline, that have not been read.

FLUSH
(Control-O or ASCII SI) when typed during output causes all subsequent output to be discarded. Typing any character reenables output. This character is also known by the POSIX name DISCARD

The character values for INTR, QUIT, ERASE, WERASE, KILL, REPRINT, EOF, EOL, EOL2, SUSP, DSUSP, STOP, START, FLUSH/DISCARD, and LNEXT may be changed to suit individual tastes (see stty(1)). If the value of a special control character is CNUL or _POSIX_VDISABLE, the function of that special control character is disabled. The ERASE, KILL, and EOF characters may be entered literally in LDISC0 (see ``Termio Structure'' below), by preceding them with the escape character (\), in which case no special function is done and the escape character is not read. Any of the special characters may be entered literally in the termios interface or if the termio interface line discipline is set to LDISC1 (see ``Termio

Structure'' below), by preceding them with the LNEXT character, in which case no special function is done and the LNEXT character is not read.

Modem Disconnect
When a modem disconnect is detected, and if CLOCAL is not set in the line discipline mode (see the discussion of the c_cflag field below), a SIGHUP signal is sent to the terminal's controlling process. Unless other arrangements have been made, this signal causes the process to terminate. If SIGHUP is ignored or caught, any subsequent read returns with an end-of-file indication until the terminal is closed. Thus, programs that read a terminal and test for end-of-file can terminate appropriately after a disconnect. Any subsequent write will return -1 and set errno to EIO until the device is closed.

If the controlling process is not in the foreground process group of the terminal, a SIGTSTP is sent to the terminal's foreground process group. Unless other arrangements have been made, this signal causes the processes to stop.

Processes in background process groups that attempt to access the controlling terminal after modem disconnect, while the terminal is still allocated to the session, will receive appropriate SIGTTOU and SIGTTIN signals. Unless other arrangements have been made, this signal causes the processes to stop.

The controlling terminal will remain in this state until it is reinitialized with a successful open by the controlling process, or deallocated by the controlling process.

Terminal Parameters
The parameters that control the behavior of devices and modules providing the termios interface are specified by the termios structure defined by <termios.h>. Several ioctl(2) system calls that fetch or change these parameters use this structure, which contains the following members:

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_ospeed; /* output speed */
speed_t
c_ispeed; /* input speed; not supported */
cc_t
c_cc[NCCS]; /* control chars */ };

The special control characters are defined by the array c_cc. The symbolic name NCCS is the size of the control-character array and is also defined by <termios.h>. All space in the array is reserved or used as described below. The relative positions, subscript names, and normal default values for each function are as follows:

0 VINTR CINTR (DEL)
1 VQUIT CQUIT (Control-\) 2 VERASE CERASE (Control-H (Backspace)) 3 VKILL CKILL (Control-U) 4 VEOF CEOF (Control-D) 4 VMIN
5 VEOL CEOL (NUL) 5 VTIME
6 VEOL2 CEOL2 (NUL)
7 VSWTCH CNSWTCH (NUL)
8 VSTART CSTART (Control-Q) 9 VSTOP CSTOP (Control-S) 10 VSUSP CNSWTCH (NUL)
11 VDSUSP CNUL (NUL)
12 VREPRINT CRPRNT (Control-R)
13 VFLUSH CFLUSH (Control-O) 14 VWERASE CWERASE (Control-W)
15 VLNEXT CLNEXT (Control-V)

Input Modes

The c_iflag field describes the basic terminal input control. The values, functions, and symbolic names of the bits in the c_iflag field are as follows:

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. IMAXBEL 0020000 Echo BEL on input line too long.

IGNBRK
If IGNBRK is set, a break condition (a character framing error with data all zeros) detected on input is ignored, that is, not put on the input queue and therefore not read by any process.

BRKINT
If IGNBRK is not set and BRKINT is set, the break condition will flush the input and output queues and if the terminal is the controlling terminal of a foreground process group, the break condition will generate a single SIGINT signal to that foreground process group. If neither IGNBRK nor BRKINT is set, a break condition is read as a single ASCII NUL character, or if PARMRK is set, as: `0377', `0', `0'.

IGNPAR
If IGNPAR is set, a byte with framing or parity errors (other than break) is ignored.

PARMRK
If PARMRK is set, and IGNPAR is not set, a character with a framing or parity error (other than break) 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 neither PARMRK nor IGNPAR is set, a framing or parity error (other than break) is read as the single ASCII NUL character.

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

ISTRIP
If ISTRIP is set, valid input characters are first stripped to 7-bits, otherwise all 8-bits are processed.

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

IGNCR
If IGNCR is set, a received CR character is ignored (not read).

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

IUCLC
If IUCLC is set, a received upper-case alphabetic character is translated into the corresponding lower-case character.

IXON
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. The STOP and START characters will not be read, but will mearly perform flow control functions.

IXANY
If IXANY is set, any input character will restart output that has been suspended.

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

IMAXBEL
If IMAXBEL is set, the ASCII BEL character is echoed if the input stream overflows. Further input is discarded, but any input already present in the input stream is preserved.

Output Modes

The c_oflag field specifies the system treatment of output. The values, functions, and symbolic names of the bits and subfields in the c_oflag field are as follows:

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

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

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

ONLCR
If ONLCR is set, the NL character is transmitted as the CR-NL character pair.

OCRNL
If OCRNL is set, the CR character is transmitted as the NL character.

ONOCR
If ONOCR is set, no CR character is transmitted when at column 0 (first position).

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

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

OFDEL
If OFDEL is set, the fill character is DEL, otherwise NUL.

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.

The actual delays depend on line speed and system load.

NLDLY
Newline delay type 0 (NL0) selects no delay. Newline delay type 1 (NL1) 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.

CRDLY
Carriage-return delay type 0 (CR0) selects no delay. Carriage-return delay type 1 (CR1) is dependent on the current column position, type 2 (CR2) is about 0.10 seconds, and type 3 (CR3) is about 0.15 seconds. If OFILL is set, delay type 1 transmits two fill characters, and type 2, four fill characters.

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

BSDLY
Backspace delay type 0 (BS0) selects no delay. Backspace delay type 1 (BS1) lasts about 0.05 seconds. If OFILL is set, one fill character will be transmitted.

VTDLY
Vertical-tab delay type 0 (VT0) selects no delay. Verticaltab delay type 1 (VT1) lasts about 2.0 seconds.

FFDLY
Form-feed delay type 0 (FF0) selects no delay. Form-feed delay type 0 (FF0) lasts about 2.0 seconds.

Control Modes

The c_cflag field describes the hardware control of the terminal. The values, functions, and symbolic names of the bits and subfields in the c_cflag field are as follows:

CBAUD
000000017 No longer supported; see "Old termio" below.
CSIZE
000000060 Character size:
CS5
0 5 bits
CS6
000000020 6 bits
CS7
000000040 7 bits
CS8
000000060 8 bits
CSTOPB
000000100 Send two stop bits, else one.
CREAD
000000200 Enable receiver.
PARENB
000000400 Parity enable.
PARODD
000001000 Odd parity, else even.
HUPCL
000002000 Hang up on last close.
CLOCAL
000004000 Local line, else dial-up.
RCV1EN
000010000 Not supported.
XMT1EN
000020000 Not supported.
LOBLK
000040000 Block layer output.
XCLUDE
000100000 Not supported.
CIBAUD
003600000 Not supported.
PAREXT
004000000 Not supported. CNEW_RTSCTS 010000000 Use RTS/CTS flow control

CSIZE
The CSIZE bits specify the character size in bits for both transmission and reception. This size does not include the parity bit, if any.

CSTOPB
If CSTOPB is set, two stop bits are used, otherwise one stop bit. For example, at 110 baud, two stops bits are required.

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

PARENB
If PARENB is set, parity generation and detection is enabled and a parity bit is added to each character.

PARODD
If parity is enabled, the PARODD flag specifies odd parity if set, otherwise even parity is used.

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

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

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

CNEW_RTSCTS
If CNEW_RTSCTS is set, and the communications port supports it, RTS/CTS handshaking will be used. When the input queue becomes nearly full, RTS will be dropped. RTS will be reasserted when the input queue has drained sufficiently. Output is suspended when CTS is lowered and restarted when CTS is raised. This flag is automatically set on the ttyf serial port devices; see serial(7).

Local Modes

The c_lflag field of the argument structure is used by the line discipline to control terminal functions. The following flags are currently defined:

ISIG
0000001 Enable signals. ICANON 0000002 Canonical input (erase and kill processing).
XCASE
0000004 Canonical upper/lower presentation.
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. IEXTEN 0000400 Enable extended functions (not used by IRIX). ECHOCTL 0001000 Echo control characters as ^char, delete as ^?. ECHOPRT 0002000 Echo erase character as character erased. ECHOKE 0004000 BS-SP-BS entire line on line kill. FLUSHO 0020000 Output being flushed. PENDIN 0040000 Retype pending input at next read or input char. TOSTOP 0100000 Send SIGTTOU for background output.

ISIG
If ISIG is set, each input character is checked against the special control characters INTR, SUSP, DSUSP, 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 CNUL or _POSIX_VDISABLE

ICANON
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, EOLand EOL2. 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.

XCASE
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''.

ECHO
If ECHO is set, characters are echoed as received.

When ICANON is set, the following echo functions are possible.

ECHOE
If ECHO and ECHOE are set, and ECHOPRT is not set, the ERASE and WERASE characters are echoed as one or more ASCII BS SP BS, which will clear the last character(s) from a CRT screen. If ECHOE is set and ECHO is not set, the erase character is echoed as ASCII SP BS.

ECHOK
If ECHOK is set, and ECHOKE is not set, the NL character will be echoed after the kill character to emphasize that the line will be deleted. Note that an escape character or an LNEXT character preceding the erase or kill character removes any special function (see ``Special Characters'' above).

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

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

TOSTOP
If TOSTOP is set, the signal SIGTTOU is sent to a process that tries to write to its controlling terminal if it is not in the foreground process group for that terminal. This signal normally stops the process. Otherwise, the output generated by that process is output to the current output stream. Processes that are blocking or ignoring SIGTTOU signals are excepted and allowed to produce output and the SIGTTOU signal is not sent.

ECHOCTL
If ECHOCTL is set, all control characters (characters with codes between 0 and 37 octal) other than ASCII TAB, ASCII NL, the START character, the STOP character, ASCII CR, and ASCII BS are echoed as ^X, where X is the character given by adding 100 octal to the code of the control character (so that the character with octal code 1 is echoed as ^A), and the ASCII DEL character, with code 177 octal is echoed as ^?.

ECHOPRT
If ECHO and ECHOPRT are set, the first ERASE or WERASE character in a sequence echoes as a backslash (\), followed by the characters being erased. Subsequent ERASE or WERASE characters echo the characters being erased in reverse order. The next non-erase character causes a slash (/) to be typed before it is echoed.

ECHOKE
If ECHOKE is set, the kill character is echoed by erasing each character on the line from the screen (using the mechanism selected by ECHOE and ECHOPRT).

FLUSHO
If FLUSHO is set, data written to the terminal is discarded. This bit is set when the FLUSH/DISCARD character is typed. A program can cancel the effect of typing the FLUSH/DISCARD character by clearing FLUSHO.

PENDIN
If PENDIN is set, any input that has not yet been read is reprinted when the next character arrives as input.

Speed

The c_ospeed and c_ispeed fields control the output and input speeds of the line, respectively, in bits per second (bps). No current SGI devices support setting output and input speeds to different values, however, so c_ispeed is not supported.

B0
0 Hang up
B50
50 50 bps
B75
75 75 bps
B110
110 110 bps
B134
134 134 bps
B150
150 150 bps
B200
200 200 bps
B300
300 300 bps
B600
600 600 bps

B1200
1200 1200 bps
B1800
1800 1800 bps
B2400
2400 2400 bps
B4800
4800 4800 bps
B9600
9600 9600 bps B19200 19200 19200 bps B38400 38400 38400 bps B57600 57600 57600 bps B76800 76800 76800 bps B115200 115200 115200 bps

SSPEED
B9600 Default baud rate.

The B* names are provided only for convenience; applications may use plain integer values in c_ospeed and c_ispeed.

Note that capabilities of serial ports vary; not all devices support all bit rates. Some devices support additional rates.

Termio Structure
The System V termio structure is used by some ioctls; it is defined by <sys/termio.h> and includes the following members:

struct
termio {
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_ospeed; /* output speed */
speed_t
c_ispeed; /* input speed; not supported */
char
c_line; /* line discipline */
cc_t
c_cc[NCCS]; /* control chars */ };

The c_line field defines the line discipline used to interpret control characters. A line discipline is associated with a family of interpretations. For example, LDISC0 is the standard System V set of interpretations, while LDISC1 is similar to the interpretations used in the 4.3BSD tty driver. In LDISC1,

?additional control characters are available,

?control characters which are not editing characters are echoed as `^'
followed by the equivalent letter,

?backspacing does not back up into the prompt,

?input is re-typed when backspacing encounters a confusion between what
the user and the computer have typed, and

?job control is available.

The symbolic name NCCS is the size of the control-character array and is also defined by <termio.h>. The relative positions, subscript names, and typical default values for each function are as follows:

0 VINTR CINTR (DEL)
1 VQUIT CQUIT (Control-\) 2 VERASE CERASE (Control-H (backspace)) 3 VKILL CKILL (Control-U) 4 VEOF CEOF (Control-D (EOT)) 4 VMIN
5 VEOL NUL
5 VTIME
6 VEOL2 NUL

If the line discipline (c_line) is set to LDISC1, then additional control characters are defined:

7 VSWTCH CNSWTCH (NUL)
8 VSTART CSTART (Control-Q) 9 VSTOP CSTOP (Control-S) 10 VSUSP CNSWTCH (NUL)
11 VDSUSP CNUL (NUL)
12 VREPRINT CRPRNT (Control-R)
13 VFLUSH CFLUSH (Control-O) 14 VWERASE CWERASE (Control-W)
15 VLNEXT CLNEXT (Control-V)

Old termio and termios
For compatibility with existing binaries, MIPS ABI programs, and programs that cannot be ported to use the new termio or termios structures, the old interfaces are retained. Existing binaries automatically use the old interfaces. By defining _OLD_TERMIOS at compile time (before including <termios.h>, <termio.h>, or <sys/ttydev.h>), the old interfaces are in effect. The old termios structure is defined as follows:

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 */
cc_t
c_cc[NCCS]; /* control chars */ };

and the old termio structure is defined as follows:

struct
termio {
tcflag_t
c_iflag; /* input modes */
tcflag_t
c_oflag; /* output modes */
tcflag_t
c_cflag; /* control modes */

tcflag_t
c_lflag; /* local modes */
char
c_line; /* line discipline */
cc_t
c_cc[NCCS]; /* control chars */ };

The members are as described above, except for c_cflag, in which CBAUD encodes the bit rate:

CBAUD 000000017 Baud rate:
B0 0 Hang up

B50
000000001 50 baud
B75
000000002 75 baud
B110
000000003 110 baud
B134
000000004 134 baud
B150
000000005 150 baud
B200
000000006 200 baud
B300
000000007 300 baud
B600
000000010 600 baud B1200 000000011 1200 baud B1800 000000012 1800 baud B2400 000000013 2400 baud B4800 000000014 4800 baud B9600 000000015 9600 baud B19200 000000016 19200 baud
EXTA
000000016 External A B38400 000000017 38400 baud
EXTB
000000017 External B

SSPEED B9600 Default baud rate.

Mixing old and new interfaces
If a bit rate is set using the new termio or termios interfaces (or the POSIX interfaces described in termios(3)) that cannot be represented in the old CBAUD field, then the old termio, termios, and POSIX interfaces will return _INVALID_BAUD in the CBAUD field. If the bit rate is set to _INVALID_BAUD using the old interfaces, the bit rate change will be ignored, and the actual line speed will remain unchanged. This allows many programs that do not explicitly manage bit rates to work with the new interfaces without change. And, it allows some old programs to work with new, fast bit rates without change. For example, sequences similar to the following (which are very common) work with either old or new interfaces, even if the line is currently set to a baud rate than cannot be represented in the old CBAUD field:

struct termio t;

ioctl(fd, TCGETA, &t);
t.c_cflag |= CREAD;
t.c_lflag &= ~ECHO;
/* t.c_cflag & CBAUD may contain _INVALID_BAUD, but, if so, */ /* this TCSETA will not affect the actual bit rate */ ioctl(fd, TCSETA, &t);

System Calls
The ioctl()s supported by devices and STREAMS modules providing the termio and termios interface are listed below.

TCGETA
The argument is a pointer to a termio structure. Get the parameters associated with the terminal and store in the termio structure referenced by arg.

TCSETA
The argument is a pointer to a termio structure. Set the parameters associated with the terminal from the structure referenced by arg. The change is immediate.

TCSETAW
The argument is a pointer to a termio structure. Wait for the output to drain before setting the new parameters. This form should be used when changing parameters that will affect output.

TCSETAF
The argument is a pointer to a termio structure. Wait for the output to drain, then flush the input queue and set the new parameters.

TCGETS
The argument is a pointer to a termios structure. Get the parameters associated with the terminal and store in the termios structure referenced by arg. See tcgetattr(3).

TCSETS
The argument is a pointer to a termios structure. Set the parameters associated with the terminal from the structure referenced by arg. The change is immediate. See tcsetattr(3).

TCSETSW
The argument is a pointer to a termios structure. Wait for the output to drain before setting the new parameters. This form should be used when changing parameters that will affect output. See tcsetattr(3).

TCSETSF
The argument is a pointer to a termios structure. Wait for the output to drain, then flush the input queue and set the new parameters. See tcsetattr(3).

TCSBRK
The argument is an int value. Wait for the output to drain. If arg is 0, then send a break (zero bits for 0.25 seconds). See tcsendbreak(3) and tcdrain(3).

TCXONC
Start/stop control. The argument is an int value. If arg is 0, suspend output; if 1, restart suspended output; if 2, suspend input; if 3, restart suspended input. See tcflow(3).

TCFLSH
The argument is an int value. If arg is 0, flush the input queue; if 1, flush the output queue; if 2, flush both the input and output queues. See tcflush(3).

TIOCNOTTY
Disconnect calling process from terminal and session.

TIOCSTI
Simulate terminal input: arg points to a character which the system pretends has been typed on the terminal.

TIOCSPGRP
Set process group of tty: arg is a pointer to a pid_t which is the value to which the process group ID for this terminal will be set. See tcsetpgrp(3).

TIOCGPGRP
Get process group of tty: arg is a pointer to a pid_t into which is placed the process group ID of the process group for which this terminal is the controlling terminal. See tcgetpgrp(3).

TIOCGSID
arg is a pointer to a pid_t into which is placed the session ID of the terminal.

TIOCFLUSH
If the int pointed to by arg has a zero value, all characters waiting in input or output queues are flushed. Otherwise, the value of the int is for the FREAD and FWRITE bits defined in <sys/file.h>; if the FREAD bit is set, all characters waiting in input queues are flushed, and if the FWRITE bit is set, all characters waiting in output queues are flushed.

TIOCMGET
The argument is a pointer to an int sized bit field into which the current state of the modem status lines is stored. This ioctl() is supported only on special files representing serial ports. See serial(7). The symbolic names of the bits returned in arg are defined by <sys/termios.h>:

TIOCM_LE
line enable
TIOCM_DTR
data terminal ready
TIOCM_RTS
request to send
TIOCM_ST
secondary transmit
TIOCM_SR
secondary receive
TIOCM_CTS
clear to send
TIOCM_CAR
carrier detect
TIOCM_CD
synonym for TIOCM_CAR TIOCM_RNG ring
TIOCM_RI
synonym for TIOCM_RNG
TIOCM_DSR
data set ready

Not all of these are necessarily supported by any particular device.

TIOCMSET
The argument is a pointer to an int sized bit field used to set the state of the modem status lines. If a bit is set, the coresponding modem status line is turned on. If a bit is cleared the coresponding modem status line is turned off. This ioctl() is supported only on special files representing serial ports. See serial(7). The symbolic names of the bits used in arg are the same as for TIOCMGET. Only DTR and RTS are settable with this ioctl(). Not all of these are necessarily supported by any particular device.

TIOCGWINSZ Get window size: arg is a pointer to a structure of the following form: Window size structure:

struct winsize {
unsigned short ws_row; /* rows, in chars */ unsigned short ws_col; /* columns, in chars */ unsigned short ws_xpixel; /* horiz. pixels */ unsigned short ws_ypixel; /* vert. pixels */ };

TIOCSWINSZ Set window size: arg is a pointer to a structure of a winsize structure.

FIONREAD Return the number of bytes currently available to read. arg is a pointer to an int.

FIONBIO
Enables or disables non-blocking mode, according to the boolean value of the contents of arg. arg is a pointer to an int. Enabling this mode has the same effect as the O_NDELAY flag for open(2).

The following ioctl calls apply only to pseudo terminals; see pty(7M) for their descriptions:

TIOCPKT, TIOCPKT_DATA, TIOCPKT_FLUSHREAD, TIOCPKT_FLUSHWRITE, TIOCPKT_STOP, TIOCPKT_START, TIOCPKT_NOSTOP and TIOCPKT_DOSTOP.

NOTES

Of the ioctl commands listed above, all except TCGETA and TCGETS alter the state of the terminal. For this reason, a background job which issues any of commands except TCGETA or TCGETS will be suspended. Refer to csh(1) or ksh(1) for more information about job control.

FILES

/dev/tty*

SEE ALSO

stty(1), fork(2), ioctl(2), setsid(2), setpgrp(2), signal(2), tcdrain(3), tcflow(3), tcflush(3), tcgetattr(3), tcgetpgrp(3), tcsendbreak(3), tcsetattr(3), tcsetpgrp(3), pty(7M), serial(7), termios(3)


Table of Contents