termio(7) Miscellaneous Information Manual termio(7)
NAME
termio, termios - general terminal interface
DESCRIPTION
All HP-UX asynchronous communications ports use the same general interface, regardless of what hardware is involved. Network connections
such as (see rlogin(1) use the pseudo-terminal interface (see pty(7).
This discussion centers around the common features of this interface.
Opening a Terminal File
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 special programs such as (see getty(1M)) and become a user's standard input, standard output,
and standard error files.
If both the and flags (see open(2)) are clear, an open blocks until the type of modem connection requested (see modem(7)) is completed. If
either the or flag is set, an open succeeds and return immediately without waiting for the requested modem connection to complete. The
flag (see can also affect open(2).
Process Groups
A terminal can have a foreground process group associated with it. This foreground process group plays a special role in handling signal-
generating input characters.
Command interpreter processes can allocate the terminal to different jobs (process groups) by placing related processes in a single process
group and associating this process group with the terminal. A terminal's foreground process group can be set or examined by a process,
assuming that the permission requirements are met (see tcsetpgrp(3C) or tcgetpgrp(3C)). The terminal interface aids in this allocation by
restricting access to the terminal by processes that are not in the foreground process group.
A process group is considered orphaned when the parent of every member of the process group is either itself a member of the process group
or is not a member of the group's session (see Sessions).
Sessions
A process that creates a session (see setsid(2) or setpgrp(2)) becomes a session leader. Every process group belongs to exactly one ses-
sion. A process is considered to be a member of the session of which its process group is a member. A newly created process joins the
session of its parent. A process can change its session membership (see setpgid(2) or setpgrp(2)). Usually a session comprises all the
processes (including children) created as a result of a single login.
The Controlling Terminal
A terminal can belong to a process as its controlling terminal. Each process of a session that has a controlling terminal has the same
controlling terminal. A terminal can be the controlling terminal for at most one session. The controlling terminal for a session is allo-
cated by the session leader. If a session leader has no controlling terminal and opens a terminal device file that is not already associ-
ated with a session without using the option (see open(2), the terminal becomes the controlling terminal of the session and the controlling
terminal's foreground process group is set to the process group of the session leader. While a controlling terminal is associated with a
session, the session leader is said to be the controlling process of the controlling terminal.
The controlling terminal is inherited by a child process during a (see fork(2)). A process relinquishes its controlling terminal if it
creates a new session with or (see setsid(2) and setpgrp(2)), or when all file descriptors associated with the controlling terminal have
been closed.
When the controlling process terminates, the controlling terminal is disassociated from the current session, allowing it to be acquired by
a new session leader. A signal is sent to all processes in the foreground process group of the controlling terminal. Subsequent access to
the terminal by other processes in the earlier session can be denied (see with attempts to access the terminal treated as if a modem dis-
connect had been sensed.
Terminal Access Control
Read operations are allowed (see from processes in the foreground process group of their controlling terminal. If a process is not in the
foreground process group of its controlling terminal, the process and all member's of its process group are considered to be in a back-
ground process group of this controlling terminal. All attempts by a process in a background process group to read from its controlling
terminal will be denied. If denied and the reading process is ignoring or blocking the signal, or the process (on systems that implement
vfork separately from fork) has made a call to vfork(2) but has not yet made a call to exec(2), or the process group of the reading process
is orphaned, returns -1 with set to and no signal is sent. In all other cases where the read is denied, the process group of the reading
process will be sent a signal. The default action of the signal is to stop the process to which it is sent.
If the process is in the foreground process group of its controlling terminal, write operations are allowed (see Attempts by a process in a
background process group to write to its controlling terminal are denied if (see is set, the process is not ignoring and not blocking the
signal, and the process (on systems that implement vfork separately from fork) has not made a call to vfork(2) without making a subsequent
call to exec(2). If the write is denied and the background process group is orphaned, the returns -1 with set to If the write is denied
and the background process group is not orphaned, the signal is sent to the process group of the writing process. The default action of
the signal is to stop the process to which it is sent.
Certain calls that set terminal parameters are treated in the same fashion as write, except that is ignored; that is, the effect is identi-
cal to that of terminal writes when is set.
Input Processing and Reading Data
A terminal device associated with a terminal device file can operate in full-duplex mode, so that data can arrive, even while data output
is occurring. Each terminal device file has an input queue associated with it into which incoming data is stored by the system before
being read by a process. The system imposes a limit, on the number of characters that can be stored in the input queue. This limit is
dependent on the particular implementation, but is at least 256. When the input limit is reached, all saved characters are discarded with-
out notice.
All input is processed either in canonical mode or non-canonical mode (see Canonical Mode Input Processing and Additionally, input charac-
ters are processed according to the (see and (see fields. For example, such processing can include echoing, which in general means trans-
mitting input characters immediately back to the terminal when they are received from the terminal. This is useful for terminals that
operate in full-duplex mode.
The manner in which data is provided to a process reading from a terminal device file depends on whether the terminal device file is in
canonical or non-canonical mode.
Another dependency is whether the or flag is set by either open(2) or fcntl(2). If the and flags are both clear, the read request is
blocked until data is available or a signal is received. If either the or flag is set, the read request completes without blocking in one
of three ways:
o If there is enough data available to satisfy the entire request, completes successfully, having read all of the data requested, and
returns the number of characters read.
o If there is not enough data available to satisfy the entire request, completes successfully, having read as much data as possible, and
returns the number of characters read.
o If there is no data available, returns -1, with set to when the flag is set. Otherwise, (flag is clear and is set) completes success-
fully, having read no data, and returns a count of 0.
The availability of data depends upon whether the input processing mode is canonical or non-canonical. The following sections, and
describe each of these input processing modes. In canonical mode input processing, terminal input is processed in units of lines, where a
line is delimited by a new-line (NL) character, an end-of-file (EOF) character, or an end-of-line character (EOL) or (EOL2). See Special
Characters for more information on and This means that a read request does not return until an entire line has been typed or a signal has
been received. 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 can be requested in a read, even one, without losing information.
is the limit on the number of characters in a line. This limit varies with each particular implementation, but is at least 256.
When the limit is reached, all characters in the current undelimited line are discarded without notice.
Erase and kill processing occur when any of three special characters, the ERASE, WERASE, or KILL characters (see is received. This pro-
cessing affects data in the input queue that has not yet been delimited by a NL, EOF, EOL, or EOL2 character. This undelimited data makes
up the current line. The ERASE character deletes the last character in the current line, if one exists. The WERASE character deletes the
last word in the current line, if one exists. A word is defined as a series of non-blank characters (tabs are equivalent to blanks). The
KILL character deletes all data in the current line, if any, and optionally outputs a new-line (NL) character. These characters operate on
a key-stroke basis, independent of any backspacing or tabbing that may have preceded them. ERASE, WERASE, and KILL characters have no
effect if the current line is empty. ERASE, WERASE, and KILL characters are not placed in the input queue. In non-canonical mode input
processing, input characters are not assembled into lines, and erase and kill processing does not occur. The values of the and members of
the array (see are used to determine how to process the characters received. represents the minimum number of characters that should be
received before successfully returns. TIME is a timer of 0.10 second granularity that is used to timeout bursty and short term data trans-
missions. The four possible cases for MIN and TIME and their interactions are described below.
Case A: MIN > 0, TIME > 0
In this case, TIME serves as an inter-character timer and is activated after the first character is received. Since it is an inter-charac-
ter timer, it is reset after each character is received. The interaction between MIN and TIME is as follows:
o As soon as one character is received, the inter-character timer is started.
o If MIN characters are received before the inter-character timer expires (remember that the timer is reset upon receipt of each charac-
ter), the read is satisfied. If the timer expires before MIN characters are received, the characters received to that point are
returned to the user.
o 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 blocks until the MIN and TIME mechanisms are activated by the receipt of
the first character, or a signal is received.
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 after any previous read completes (that is, the pending read blocks until MIN characters are received), or a
signal is received. A program that uses this case to handle record-based terminal I/O can block indefinitely in the read operation.
Case C: MIN = 0, TIME > 0
In this case, since the value of MIN is zero, TIME no longer represents an inter-character timer. It now serves as a read timer that is
activated as soon as the function is processed. A read is satisfied as soon as a single character is received or the read timer expires.
If the timer expires, no character is returned. If the timer does not expire, the only way the read can be satisfied is by a character
being received. A read cannot block indefinitely waiting for a character because if no character is received within TIME x 0.10 seconds
after the read is initiated, returns a value of zero, having read no data.
Case D: MIN = 0, TIME = 0
The number of characters requested or the number of characters currently available, whichever is less, is returned without waiting for more
characters to be input. If no characters are available, returns a value of zero, having read no data.
Some points to note about MIN and TIME:
1. In the above explanations, the interactions of MIN and TIME are not symmetric. For example, when MIN > 0 and TIME = 0, TIME has no
effect. However, in the opposite case where MIN = 0 and TIME > 0, both MIN and TIME play a role in that MIN is satisfied with the
receipt of a single character.
2. Also note that in case A ( MIN > 0, TIME > 0 ), TIME represents an inter-character timer while in case C ( MIN = 0, TIME > 0 ), TIME
represents a read timer.
These two points highlight the dual purpose of the MIN/TIME feature. Cases A and B (where MIN > 0 ) exist to handle burst mode activity
(such as file transfer programs) where a program would like to process at least MIN characters at a time. In case A, the inter-character
timer is activated by a user as a safety measure while in case B it is turned off.
Cases C and D exist to handle single character timed transfers. These cases are readily adaptable to screen-based applications that need
to know if a character is present in the input queue before refreshing the screen. In case C the read is timed, while in case D it is not.
Another important note is that MIN is always just a minimum. It does not denote a record length. For example, if a program initiates a
read of 20 characters when MIN is 10 and 25 characters are present, 20 characters will be returned to the user. Had the program requested
all characters, all 25 characters would be returned to the user.
Furthermore, if TIME is greater than zero and MIN is greater than the read will never terminate as a result of MIN characters being
received because all the saved characters are discarded without notice when is exceeded. If TIME is zero and MIN is greater than the read
will never terminate unless a signal is received.
Special Characters
Certain characters have special functions on input, output, or both. Unless specifically denied, each special character can be changed or
disabled. To disable a character, set its value to (see unistd(5)). These special functions and their default character values are:
INTR (Rubout or ASCII DEL) special character on input and is recognized if (see is enabled. Generates a signal which is sent
to all processes in the foreground process group for which the terminal is the controlling terminal. Normally, each such
process is forced to terminate, but arrangements can be made to either ignore or hold the signal, or to receive a trap to
an agreed-upon location; see signal(2) and signal(5). If is set, the INTR character is discarded when processed. If is
clear, the INTR character is processed as a normal data character, and no signal is sent.
QUIT (Control- or ASCII FS) special character on input. Recognized if (see is set. The treatment of this character is iden-
tical to that of the INTR character except that a signal is generated and the processes that receive this signal are not
only terminated, but a core image file (called is created in the current working directory if the implementation supports
core files.
SWTCH (ASCII NUL) special character on input and is only used by the shell layers facility shl(1). The shell layers facility
is not part of the general terminal interface. No special functions are performed by the general terminal interface when
SWTCH characters are encountered.
ERASE special character on input and is recognized if (see is enabled. Erases the preceding character. Does not erase beyond
the start of a line, as delimited by a NL, EOF, EOL, or EOL2 character. If is enabled, the ERASE character is discarded
when processed. If is not enabled, the ERASE character is treated as a normal data character.
WERASE (disabled) special character on input and is recognized if (see is enabled. Erases the preceding word. Does not erase
beyond the start of a line, as delimited by a NL, EOF, EOL, or EOL2 character. If is enabled, the WERASE character is
discarded when processed. If is not enabled, the WERASE character is treated as a normal data character.
KILL special character on input and is recognized if is enabled. KILL deletes the entire line, as delimited by a NL, EOF,
EOL, or EOL2 character. If is enabled, the KILL character is discarded when processed. If is not enabled, the KILL
character is treated as a normal data character.
EOF (Control-D or ASCII EOT) special character on input and is recognized if is enabled. EOF can 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, (that is, the EOF
occurred at the beginning of a line) a character count of zero is returned from representing an end-of-file indication.
If is enabled, the EOF character is discarded when processed. If is not enabled, the EOF character is treated as a nor-
mal data character.
NL (ASCII LF) special character on input and is recognized if flag is enabled. It is the line delimiter If is not enabled,
the NL character is treated as a normal data character.
EOL (ASCII NUL) special character on input and is recognized if is enabled. EOL is an additional line delimiter similar to
NL. It is not normally used. If is not enabled, the EOL character is treated as a normal data character.
EOL2 (disabled) special character on input and is recognized if is enabled. EOL2 is an additional line delimiter similar to
EOL. It is not normally used. If is not enabled, the EOL2 character is treated as a normal data character.
SUSP (disabled) special character recognized on input. If is enabled, receipt of the SUSP character causes a signal to be
sent to all processes in the foreground process group for which the terminal is the controlling terminal, and the SUSP
character is discarded when processed. If is not enabled, the SUSP character is treated as a normal data character.
Command interpreter processes typically set SUSP to Control-Z.
DSUSP (disabled) special character recognized on input. If is enabled, and a process in the foreground process group attempts
to read the DSUSP character, a signal is sent to all processes in the foreground process group for which the terminal is
the controlling terminal, and the DSUSP character is then discarded. If is not enabled, the DSUSP character is treated
as a normal data character. Note that DSUSP is similar to SUSP except that the signal is sent when a process in the
foreground process group attempts to read the DSUSP character, rather than when it is typed.
STOP (Control-S or ASCII DC3) special character on both input and output. If (output control) is enabled, processing of the
STOP character temporarily suspends output to the terminal device. This is useful with CRT terminals to prevent output
from disappearing before it can be read. While output is suspended and is enabled, STOP characters are ignored and not
read. If is enabled, the STOP character is discarded when processed. If is not enabled, the STOP character is treated
as a normal data character. If (input control) is enabled, the system sends a STOP character to the terminal device when
the number of unread characters in the input queue is approaching a system specified limit. This is an attempt to pre-
vent this buffer from overflowing by telling the terminal device to stop sending data.
START (Control-Q or ASCII DC1) special character on both input and output. If (output control) is enabled, processing of the
START character resumes output that has been suspended. While output is not suspended and is enabled, START characters
are ignored and not read. If is enabled, the START character is discarded when processed. If is not enabled, the START
character is treated as a normal data character. If IXOFF (input control) is enabled, the system sends a START character
to the terminal device when the input queue has drained to a certain system-defined level. This occurs when the input
queue is no longer in danger of possibly overflowing.
CR (ASCII CR) special character on input is recognized if is enabled. When and are enabled and is not enabled, this charac-
ter is translated into a NL, and has the same affect as the NL character. If and are enabled, the CR character is
ignored. If is enabled and both and are not enabled, the CR character is treated as a normal data character.
LNEXT (disabled) special character recognized on input. Causes the special meaning of the next character to be ignored. This
works for all special characters specified above. It allows characters to be input that would otherwise be interpreted
by the system for a special function.
The special characters are assigned their default character values when the terminal port is opened. The default values used are those
specified by the System V Interface Definition, Third Edition (SVID3), except for the WERASE (Control-W) and LNEXT (Control-V) characters
which are set to to maintain binary compatibility with previous releases of HP-UX. The default character values assigned when the port is
opened can be changed for all ports on a system wide basis through the use of the command (see stty(1)). The character values may also be
changed for a specific port after it is opened using the command. The NL and CR characters cannot be changed or disabled. The character
values for the remaining special characters can be changed or disabled to suit individual tastes.
If is set (see the ERASE, KILL, and EOF characters can be escaped by a preceding character, in which case no special function is performed.
These characters, and the remaining special characters, may also be escaped by preceding them with the LNEXT character (see LNEXT above).
If two or more special characters have the same value, the function performed when the character is processed is undefined.
Modem Disconnect
If a modem disconnect is detected by the terminal interface for a controlling terminal, and if is clear in the field for the terminal (see
the signal is sent to the controlling process of the controlling terminal. Unless other arrangements have been made, this causes the con-
trolling process to terminate. Any subsequent read from the terminal device returns with an end-of-file indication until the device is
closed. Thus, processes that read a terminal file and test for end-of-file can terminate appropriately after a disconnect. Any subsequent
to the terminal device returns -1, with set to until the device is closed.
Closing a Terminal Device File
The last process to close a terminal device file causes any output not already sent to the device to be sent to the device even if output
was suspended. This last close always blocks (even if non-blocking I/O has been specified) until all output has been sent to the terminal
device. Any input that has been received but not read is discarded.
Writing Data and Output Processing
When characters are written, they are placed on the output queue. Characters on the output queue are transmitted to the terminal as soon
as previously-written characters are sent. These characters are processed according to the field (see Input characters are echoed by
putting them in the output queue as they arrive. If a process produces characters for output more rapidly than they can be sent, the
process is suspended when its output queue exceeds some limit. When the queue has drained down to some threshold, the process is resumed.
termios Structure
Routines that need to control certain terminal I/O characteristics can do so by using the structure as defined in the header file The
structure is defined as follows:
#define NCCS 16
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 */
tcflag_t c_reserved; /* reserved for future use */
cc_t c_cc[NCCS]; /* control chars */
};
The special characters are defined by the array The relative positions and default values for each special character function are as fol-
lows:
INTR VINTR DEL
QUIT VQUIT Control-|
ERASE VERASE #
KILL VKILL @
EOF VEOF Control-D
EOL VEOL NUL
EOL2 VEOL2 disabled
MIN VMIN NUL
TIME VTIME Control-D
SUSP VSUSP disabled
START VSTART Control-Q
STOP VSTOP Control-S
WERASE VWERASE disabled
LNEXT VLNEXT disabled
DSUSP VDSUSP disabled
termio Structure
The structure has been superseded by the structure and is provided for backward compatibility with prior applications (see The structure is
defined in the header file and is defined as follows:
#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 */
};
Modes
The next four sections describe the specific terminal characteristics that can be set using the and structures (see Any bits in the modes
fields that are not explicitly defined below are ignored. However, they should always be clear to prevent future compatibility problems.
Input Modes
The field describes the basic terminal input control:
Ignore break condition.
Signal interrupt on break.
Ignore characters with parity errors.
Mark parity errors.
Enable input parity check.
Strip character.
Map NL to CR on input.
Ignore CR.
Map CR to NL on input.
Map uppercase to lowercase on input.
Enable start/stop output control.
Enable any character to restart output.
Enable start/stop input control.
Enable BEL on input line too long.
A break condition is defined as a sequence of zero-value bits that continues for more than the time to send one character. For example, a
character framing or parity error with data all zeros is interpreted as a single break condition.
If is set, the break condition is ignored. Therefore the break condition cannot be read by any process. If is clear and is set, the break
condition flushes both the input and output queues and, if the terminal is the controlling terminal of a foreground process group, the
break condition generates a single signal to that foreground process group. If neither nor is set, a break condition is read as a single
character, or if is set, as the three-character sequence
If is set, characters with other framing and parity errors (other than break) are ignored.
If is set, and is clear, a character with a framing or parity error (other than break) is read as the three-character sequence: X, where X
is the data of the character received in error. To avoid ambiguity in this case, if is clear, a valid character of is read as If both and
are clear, a framing or parity error (other than break) is read as the character
If is set, input parity checking is enabled. If is clear, input parity checking is disabled. Whether input parity checking is enabled or
disabled is independent of whether parity detection is enabled or disabled (see If is set (see and is clear, parity generation is enabled
but input parity checking is disabled; the hardware to which the terminal is connected will recognize the parity bit, but the terminal spe-
cial file will not check whether this bit is set correctly or not.
The following table shows the interrelationship between the flags and The column marked Input gives various types of input characters
received, indicated as follows:
NUL character
Character other than
NUL
Parity error detected
Framing error detected
Items enclosed in brackets indicate one or more of the conditions are true.
If the flag is clear, characters received with parity errors are not processed according to this table, but instead, as if no parity error
had occurred. Under the flag columns, indicates the flag is set, indicates the flag is not set, and indicates the flag may be set or
clear. The column labeled shows the results that will be passed to the application code. A -- indicates that no character or condition is
passed to the application code. The value indicates that no character is returned, but that the signal is sent to the foreground process
group of the controlling terminal.
Input 1IGNBRK BRKINT IGNPAR PARMRK Read
----------------------------------------------------------------
0[PF] Set X X X --
0[PF] Clear Set X X SIGINT
0[PF] Clear Clear X Set '377','