HPUX pty[7]

pty in anderen Kapiteln des hpux Handbuch:
pty.1
pty(7) pty(7)
NAME
pty - pseudo terminal driver
SYNOPSIS
pseudo-device pty
DESCRIPTION
The pty driver provides support for a device-pair termed a pseudo
terminal. A pseudo terminal is a pair of character devices, a master
device and a slave device. The slave device provides to application
processes an interface identical to that described in termio(7).
Unlike all other devices that provide the interface described in
termio(7), the slave device does not have a hardware device behind it.
Instead, it has another process manipulating it through the master
half of the pseudo terminal. Thus anything written on the master
device is given to the slave device as input, and anything written on
the slave device is presented as input on the master device.
center ; c c c c c c c | c s | c c c c | c c | c c c c | c | c | c c c
c | c | c | c c c c c c c. _ _ pty
functions Application <-> _ _ <-> Server
Processes Slave Master Process
side side _ _
Open and Close Processing
The slave side of the pty interprets opening or closing the master
side as a modem connection or disconnection on a real terminal. Only
one open to the master side of a pty is permitted. An attempt to open
an already open master side returns -1 and sets the external variable
errno to EBUSY. An attempt to open the master side of a pty that has
a slave with an open file descriptor returns -1 and sets errno to
EBUSY. The potential problem of ptys being found busy at opens can be
avoided by using the clone open functionality discussed in the next
section.
An attempt to open a non-existent pty returns -1 and sets errno to
ENXIO. If O_NDELAY is not specified, opens on the slave side hang
until the master side is opened. If O_NDELAY is specified, opens on
the slave side return error if the master side is closed. Any ioctl()
(see ioctl(2)) or write() (see write(2)) request made on the slave
side of a pty after the master side is closed returns -1 and sets the
external variable errno to EIO. A read() request made on the slave
side of a pty after the master side is closed returns 0 bytes (see
read(2)). Closing the master side of a pty sends a SIGHUP hangup
signal to the tty process group number of the corresponding slave side
and flushes pending input and output.
Clone Open
In typical pty usage, there is no preference among pty pairs. Thus,
it is useful to be able to issue a single open() that internally opens
any available pty (see open(2)). An open on /dev/ptym/clone returns
Hewlett-Packard Company - 1 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
an open file descriptor of a free master pty device. If there are no
free devices, the open returns -1 and sets errno to EBUSY. The name
of the slave device corresponding to the opened master device can be
found through a ptsname() request (see ptsname(3C)).
Processing ioctl() Requests
By default, any ioctl() request defined by termio(7) is recognized by
both the master and slave sides of a pty. These ioctl() requests are
processed by the pty driver as specified by termio(7). In addition,
the ioctl() requests defined below are recognized by the master side
of a pty. The slave side only recognizes ioctl() requests defined by
termio(7). An ioctl() request made on the slave side of a pty after
the master side is closed returns -1 and sets the external variable
errno to EIO. An ioctl() request not recognized by the pty returns -1
and sets the external variable errno to EINVAL. Note that some of the
master-side-only ioctl() requests affect which ioctl() requests are
recognized by the master and slave side of the pty. These master-
side-only ioctl() requests also affect the way recognized ioctl()
requests, open() requests, and close() requests are processed by the
pty driver (see close(2)).
The following ioctl() requests, defined in <sys/ptyio.h>, apply only
to the master side of pty:
TIOCSIGSEND Cause a signal to be sent from the slave side of the
pty to the current tty process group of the slave side.
The value of the parameter is taken to be the signal
number sent. An EINVAL error is returned and no signal
is sent if the specified signal number does not refer
to a legitimate signal (see signal(5)). Note that this
request allows the server process to send signals to
processes not owned by the same user ID.
TIOCTTY Enable or disable all termio processing by a pty.
termio processing is enabled if the int addressed by
arg is nonzero and disabled if the int addressed by arg
is zero. By default, termio processing is enabled.
termio processing refers to processing of input and
output described by termio(7) (such as tab expansion),
as well as the processing of the ioctl() requests
described by termio(7). When disabled, all input and
output data is passed through the pty without
modification. Issuing a TIOCTTY ioctl() request
flushes all data buffered in the pseudo terminal and
releases any processes blocked waiting for data.
Enabling and disabling TIOCTTY affects the operation of
the following ioctl() requests: TIOCPKT, TIOCREMOTE,
TIOCBREAK, TIOCSTOP, TIOCSTART, TIOCTRAP, and
TIOCMONITOR.
Hewlett-Packard Company - 2 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
When TIOCTTY is enabled, all termio ioctl() requests
execute as specified in termio(7), regardless of the
side from which the ioctl() request is made. When
TIOCTTY is disabled, master side termio ioctl()
requests set and return the the external variable errno
to EINVAL. Slave side termio ioctl() requests are
processed like any other ioctl() request when TIOCTTY
is disabled. In particular, slave side termio ioctl()
requests set and return the external variable errno to
EINVAL when both TIOCTTY and TIOCTRAP are disabled.
(See the discussion of ioctl(), open(), close()
trapping below). ioctl() requests not defined by
termio(7) are not affected by the state of TIOCTTY.
Data written through a pseudo terminal with TIOCTTY
disabled is handled in a manner similar to data flowing
through a pipe. A write request blocks in the pty
until all data has been written into the pty. A read
request blocks if there is no data available unless the
O_NDELAY flag is set (see fcntl(2)). When data is
available to be read, the read request returns whatever
is available, and does not wait for the number of bytes
requested to be satisfied. The number of bytes a pty
can contain in its internal memory is implementation
dependent, but is at least 256 bytes in each direction.
For example, a write on the slave side of a pty of 1024
bytes might be read on the master side by four read
requests returning 256 bytes each. The size of the
chunks of data that are read is not guaranteed to be
consistent, but no data is lost.
The following ioctl() requests, defined in <sys/ptyio.h>, apply only
to the master side of a pty. In particular, these ioctl() requests
enable/disable specific modes of pty driver operation. These ioctl()
requests work in series with TIOCTTY; that is, the mode must be
enabled by its ioctl() request and TIOCTTY must be enabled for the
mode to operate. The mode can be enabled or disabled regardless of
the state of TIOCTTY.
TIOCPKT Enable or disable packet mode. Packet mode is enabled
if the int addressed by arg is nonzero and disabled if
the int addressed by arg is zero. By default, packet
mode is disabled. When applied to the master side of a
pseudo terminal, each subsequent read() from the master
side returns data written on the slave part of the
pseudo terminal preceded by a zero byte (symbolically
defined as TIOCPKT_DATA), or a single byte reflecting
control status information. The value of such a status
byte is composed of zero or more bit flags:
Hewlett-Packard Company - 3 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
TIOCPKT_FLUSHREAD
The read queue for the slave side has been
flushed.
TIOCPKT_FLUSHWRITE
The write queue for the slave side has been
flushed.
TIOCPKT_STOP
Data flowing from the slave side of the pty to the
master side has been stopped by means of ^S,
TIOCSTOP, or TCXONC.
TIOCPKT_START
Data flowing from the slave side of the pty to the
master side has been restarted.
TIOCPKT_DOSTOP
Stop and start characters have been set to ^S or
^Q.
TIOCPKT_NOSTOP
Stop and start characters are set to something
other than ^S or ^Q.
TIOCREMOTE Enable or disable remote mode. Remote mode is enabled
if the int value of arg is nonzero and disabled if the
int value of arg is zero. By default, remote mode is
disabled. Remote mode is independent of packet mode.
This mode causes input to the pseudo terminal to be
flow controlled and not input edited (regardless of the
terminal mode). Each write to the master side produces
a record boundary for the process reading the slave
side. In normal usage, writing data is like typing the
data as a line on a terminal; writing zero bytes is
equivalent to typing an end-of-file character (that is,
the EOF character as defined in termio(7)). The data
read by the slave side is identical to the data written
on the master side. Data written on the slave side and
read on the master side with TIOCREMOTE enabled is
still subject to the normal termio(7) processing.
TIOCREMOTE can be used when doing remote line editing
in a window manager, or whenever flow-controlled input
is required. Issuing a TIOCMONITOR ioctl() request
flushes all data buffered in the pseudo terminal.
The following ioctl() requests, defined in <sys/ptyio.h>, apply only
to the master side of pty. In particular, these ioctl() requests are
only recognized when TIOCTTY is enabled. When TIOCTTY is disabled,
these ioctl() requests set and return the external variable errno to
EINVAL.
Hewlett-Packard Company - 4 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
TIOCBREAK Cause a break operation to be done on the slave side of
the pty, as if a user had pressed the break key on a
real terminal. Takes no parameter.
TIOCSTOP Stop data flowing from the slave side of the pty to the
master side (equivalent to typing ^S). Takes no
parameter.
TIOCSTART Restart output (stopped by TIOCSTOP or by typing ^S).
Takes no parameter.
Flow-Control Input and Output Processing
The following terms are used to describe the flow of data through
psuedo terminals. INPUT refers to data flowing from the master side
of a pty to the slave side. OUTPUT refers to data flowing from the
slave side of a pty to the master side.
When packet mode (TIOCPKT) is disabled and INPUT is stopped (see
IXOFF, input modes, in termio(7)), the next read() from the master
side of a pty returns a STOP character. When INPUT is restarted, the
next read() from the master side returns a START character. If packet
mode (TIOCPKT) is enabled, the STOP or START character is preceded by
a data packet indicator (TIOCPKTDATA). select() should be used by the
master-side server before each write() request to properly handle
INPUT flow control (see select(2)).
When INPUT flow control is enabled, write() and select() are handled
as follows: Write-selects on the master side of a pty return true only
if INPUT has not been stopped. If INPUT becomes stopped while data is
being written into the master side of a pty, the write returns with
the number of bytes written before INPUT was stopped. Writes done
after INPUT is stopped return immediately with zero bytes written.
When packet mode (TIOCPKT) is disabled and OUTPUT is stopped (see
IXON, input modes in termio(7)), each subsequent read() from the
master side of a pty returns with no data read. When OUTPUT is
restarted, each subsequent read() from the master side returns data
written on the slave side. If packet mode (TIOCPKT) is enabled, the
first read() after OUTPUT has been stopped returns a TIOCPKTSTOP
packet. All subsequent reads from the master side while OUTPUT is
stopped returns a TIOCPKTDATA packet with no data. When OUTPUT is
restarted, the next read() from the master side returns a TIOCPKTSTART
packet. All subsequent reads from the master side return data written
on the slave side preceded by a TIOCPKTDATA packet. select() should
be used by the master-side server before each read() to properly
handle OUTPUT flow control. Otherwise, reads from the master side of
a pty will not be prevented when OUTPUT is stopped.
Trapping ioctl(), open(), close() Requests
When trapping is enabled, the master side is notified when the
application on its slave side makes an ioctl(), open(), or close()
Hewlett-Packard Company - 5 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
request. For trapped ioctl() and open() requests, the slave side is
blocked (that is, the request does not complete) until the server on
its master side acknowledges the trapped request. For trapped close()
requests, the slave slave does not block for an acknowledgement.
select() should be used by the master side server to receive
notification of trapped ioctl(), open(), and close() requests. When
one of these requests is trapped, the select() returns with an
"exceptional condition" indicated for the slave side's file
descriptor. Other mechanisms for receiving notification of trapped
requests are defined below, but these mechanisms should be used only
if select() is not available.
When trapping is disabled (default condition), ioctl() requests made
to the slave side set fail and return the external variable errno to
EINVAL if they are not recognized by the slave side of the pty driver.
The only ioctl() requests recognized by the slave side are those
defined by termio(7) and only when TIOCTTY is enabled. When TIOCTTY
is disabled, no ioctl() requests are recognized by the slave side. If
trapping is enabled and the master side closes, trapping is disabled.
If the master closes during the middle of a handshake with the slave,
the handshake is done automatically.
Trapping occurs in two forms that are identified by the ioctl()
requests that enable or disable them - TIOCTRAP and TIOCMONITOR.
These two forms are distinguished by the types of requests they affect
and by the capabilities they provide. Trapping open() and close()
requests is enabled or disabled by TIOCTRAP. Trapping ioctl()
requests not defined by termio(7) are enabled or disabled by TIOCTRAP.
Trapping ioctl() requests defined by termio(7) are enabled or disabled
by TIOCTRAP only when TIOCTTY is also disabled. When TIOCTTY is
enabled, trapping ioctl() requests defined by termio(7) are enabled or
disabled by TIOCMONITOR. Briefly, both TIOCTRAP and TIOCMONITOR
trapping allow the server on the master side to examine the request's
parameters, the pid making the request, etc. In addition, TIOCTRAP
trapping allows the server to modify the parameters and return values
of an ioctl() request.
The following ioctl() calls apply only to the master side of a pty and
pertain to trapping ioctl(), open(), and close() requests. They are
defined in <sys/ptyio.h>:
TIOCTRAP Enable or disable trapping of ioctl(), open(), and
close() requests made by the application on the slave
side of a pty. Trapping is enabled if the int
addressed by arg is nonzero and disabled if the int
addressed by arg is zero. By default, TIOCTRAP
trapping is disabled.
TIOCTRAPSTATUS Check for a pending ioctl(), open(), or close() trap.
The argument points to an int that is set to one if a
Hewlett-Packard Company - 6 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
trap is pending and to zero if nothing is pending. Use
TIOCTRAPSTATUS when the preferred method of a select()
"exceptional condition" is not available.
TIOCREQCHECK Return the trapped ioctl(), open(), or close()
information to the master side. Use TIOCREQCHECK in
response to either a select() "exceptional condition"
or a TIOCTRAPSTATUS indicating that a trap is pending.
A TIOCREQCHECK reads the pending ioctl(), open(), or
close() information into the memory pointed to by the
arg of TIOCREQCHECK. The information takes the form of
the following request_info structure, defined in
<sys/ptyio.h>:
struct request_info {
int request;
int argget;
int argset;
short pgrp;
short pid;
int errno_error;
int return_value;
};
All elements of request_info refer to the slave side of
the pty and include the following:
request The ioctl() command received.
argget The ioctl() request applied to
master side to receive the trapped
ioctl() structure, if one exists (a
zero value means there is none).
(When nonzero, argget is a
TIOCARGGET request with the size
field precomputed.)
argset The ioctl() request applied to
master side to send back the
resulting ioctl() structure, if one
exists (a zero value means there is
none). (When nonzero, argset is a
TIOCARGSET request with the size
field precomputed.)
pgrp The process group number of the
process doing the operation.
pid The process ID of the process doing
the operation.
Hewlett-Packard Company - 7 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
errno_error The errno external variable error
code (initialized to zero) returned
by ioctl() on the slave side.
return_value The success value (initialized to
zero) returned by ioctl() on the
slave side when errno_error is not
set.
When the ioctl() argument received on the slave
side is not a pointer, its value is stored as four
bytes retrievable with an ioctl() request to the
master side equal to argget.
When an open() or close() is being passed, request
is set to TIOCOPEN or TIOCCLOSE, respectively.
For TIOCOPEN and TIOCCLOSE, both argget and argset
are zero because there is no ioctl() structure.
When TIOCTTY is enabled, the termio(7) definition
of open/close is executed first before being
passed to the master side. Note that while all
opens are trapped, only the last close on a
particular inode for a pty slave side is trapped
by the pty.
A TIOCREQCHECK returns the external variable errno
error EINVAL if no ioctl(), open(), or close()
trap is pending. Accordingly, a TIOCREQCHECK that
returns EINVAL in response to a select()
"exceptional condition" indicates that the trapped
ioctl(), open(), or close() request was terminated
by a signal after select() returned.
TIOCREQGET Identical to TIOCREQCHECK except when no ioctl(),
open(), or close() trap is pending. A TIOCREQGET
blocks until a slave side ioctl(), open(), or close()
is trapped; whereas a TIOCREQCHECK returns EINVAL. Use
TIOCREQGET when neither the preferred method of a
select (2) "exceptional condition" nor the master side
ioctl() TIOCTRAPSTATUS is available.
TIOCREQSET Complete the handshake started by a previous
TIOCREQCHECK or TIOCREQGET. The argument should point
to the request_info structure, as defined by the
TIOCREQCHECK.
Before doing this ioctl() request to complete the
handshake, the server should set errno_error to an
external variable errno error value to be passed back
to the slave side. If there is no error, errno_error
can be left alone because the pty initializes it to
Hewlett-Packard Company - 8 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
zero. Also, when there is no error, return_value
should be set if other than a zero result is desired.
The server can set return_value and errno_error if the
trapped request is an ioctl(). Setting either
return_value or errno_error for a trapped open() or
close() affects neither the return value of the request
nor the external variable errno value of the slave
side. Further, setting either return_value or
errno_error does not cause TIOCREQSET to return an
error to the server.
If the TIOCREQSET request is made and the request value
in the passed request_info structure does not equal the
trapped value, the external variable errno is set and
returned as EINVAL. EINVAL is also returned if there
are no trapped ioctl(), open(), or close() requests.
If the trapped request has been interrupted by a signal
between the time that the server has done the
TIOCREQGET and the TIOCREQSET, the TIOCREQSET request
returns EINVAL.
TIOCMONITOR Enable or disable read-only trapping of termio ioctl()
requests. TIOCMONITOR trapping is enabled if the int
addressed by arg is nonzero and disabled if the int
addressed by arg is zero. By default, TIOCMONITOR
trapping is disabled. TIOCMONITOR works in series with
TIOCTTY; that is, the TIOCMONITOR trapping must be
enabled and TIOCTTY must be enabled for termio ioctl()
requests to be trapped by TIOCMONITOR. TIOCMONITOR
trapping can be enabled or disabled regardless of the
state of TIOCTTY.
When TIOCTTY is disabled, termio ioctl() requests are
not trapped by TIOCMONITOR. However, ioctl() requests
are trapped by TIOCTRAP if TIOCTTY is disabled and
TIOCTRAP is enabled. TIOCTRAP trapping allows the
master side server to modify the parameters and return
values of an ioctl() request, whereas TIOCTMONITOR
trapping does not.
TIOCMONITOR trapping allows the server on the master
side to know when characteristics of the line
discipline in the pty are changed by an application on
its slave side. The mechanism for handshaking termio
requests trapped by TIOCMONITOR is the same as the
mechanism described above for requests trapped by
TIOCTRAP. (It is recommended that termio ioctl()
requests be used on the master side to interrogate the
configured state of the line discipline in the pty.
This compensates for the window of time before
TIOCMONITOR is enabled, when termio ioctl() requests
Hewlett-Packard Company - 9 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
are not trapped.)
When using select() on the master side of a pty, the "exceptional
condition" refers to an open(), close(), or ioctl() request pending on
the slave side, while "ready for reading or writing" refers to a
read() or write() request pending.
Of the ioctl() requests subject to being trapped, only one-per-pty can
be handled at a time. This means that when an application does a
non-termio ioctl() request to the slave side, all other ioctl()
requests to the same pty slave side are blocked until the first one is
handshaked back by the master side. (ioctl() requests that are not
trapped, such as termio when TIOCTTY is enabled and TIOCMONITOR is
disabled, are not blocked.) This permits the implementation of
indivisible operations by an ioctl() call on the slave side that is
passed to the server process.
In summary, the following method of handling trapped ioctl(), open(),
and close() requests is preferred:
1. Call select(). This system call blocks the master side
until a slave side ioctl(), open(), or close() request is
trapped.
2. Make TIOCREQCHECK ioctl() request. This step returns
information about a trapped ioctl(), open(), or close()
request. If TIOCREQCHECK returnsthe external variable errno
error EINVAL, loop back to the select() call.
3. Make argget ioctl() request. This optional step is used if
argget is nonzero and the server wants to do more than just
reject the trapped slave ioctl() request.
4. Make argset ioctl() request. This optional step is done if
argset is nonzero and the server wants to pass back a
modified ioctl() structure. It is done after the trapped
ioctl() request is processed via the server on the master
side.
5. Set errno_error and return_error. If the trapped request is
an ioctl(), set errno_error appropriately. If the
appropriate value for errno_error is zero, return_error must
be set.
6. Make TIOCREQSET ioctl() request. This step completes the
trapped ioctl(), open(), close() request.
While a process is waiting in the slave side of the pty for the server
to complete a handshake, it is susceptible to receiving signals. The
following master side ioctl() request allows the server process to
control how the pty responds when a signal attempts to interrupt a
Hewlett-Packard Company - 10 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
trapped open() or ioctl() request:
TIOCSIGMODE Set the signal handling state of the pty to the mode
specified as the argument. The mode can have three
values, which are TIOCSIGBLOCK, TIOCSIGABORT, and
TIOCSIGNORMAL.
TIOCSIGBLOCK
Cause some signals to be postponed that are
destined for the slave-side process whose
open() or ioctl() request is trapped.
Signals are postponed if they would otherwise
cause the process to jump to an installed
signal handler. Signals are not postponed if
they would otherwise cause the process to
abort or if they are being ignored. When the
server process completes the handshake by
means of the TIOCREQSET ioctl() request, the
process returns to the calling program and
any pending signals are then acted upon. Any
signals that the user has blocked by means of
sigblock() continues to be blocked.
TIOCSIGABORT
Prevent a trapped open() or ioctl() request
from being restarted. The server process
sets this mode when it wants the interrupted
requests to return to the calling program
with an EINTR error.
TIOCSIGNORMAL
This is the default mode of the pty. If a
signal interrupts a trapped open() or ioctl()
request, the user's signal handler routine
can specify whether the request is to be
restarted. If the request is restarted, it
executes again from the beginning and the
server has to make another TIOCREQGET request
to start the handshake over again. If the
user's signal handler routine specifies that
the interrupted request should not be
restarted, the request returns to the calling
program with EINTR upon completion of the
signal handler. Note that the restarted
request is not necessarily the very next one
to be trapped.
WARNINGS
The slave side cannot indicate an end-of-file condition to the master
side.
Hewlett-Packard Company - 11 - HP-UX Release 9.0: August 1992
pty(7) pty(7)
When using TIOCREMOTE, a single write() request to the master side of
greater than 256 bytes may result in multiple smaller records being
read from the slave side instead of only one record.
DEPENDENCIES
Series 300/400
The clone open functionality is currently supported on the Series 800
systems only.
The largest ioctl() argument passable between master and slave sides
is currently limited to 128 bytes.
Slave-side non-termio ioctl() requests either go unrecognized or are
passed to the master side, depending upon the state of the TIOCTRAP.
Series 700
The clone open functionality is currently supported on the Series 800
systems only.
AUTHOR
pty was developed by the University of California, Berkeley.
FILES
/dev/ptym/pty[a-ce-z][0-9][0-9] master pseudo terminals
/dev/ptym/pty[a-ce-z][0-9a-f] master pseudo terminals
/dev/pty[pqr][0-9a-f] master pseudo terminals
/dev/pty/tty[a-ce-z][0-9][0-9] slave pseudo terminals
/dev/pty/tty[a-ce-z][0-9a-f] slave pseudo terminals
/dev/tty[pqr][0-9a-f] slave pseudo terminals
SEE ALSO
ioctl(2), select(2), signal(5), termio(7).
Hewlett-Packard Company - 12 - HP-UX Release 9.0: August 1992