NAME
pts — STREAMS slave pty (pseudo-terminal) driver
SYNOPSIS
#include <sys/stropts.h>
#include <sys/termios.h>
#include <sys/strtio.h>
int open("/dev/pts/N", O_RDWR);
DESCRIPTION
A pseudo-terminal (pty) consists of a tightly-coupled pair of character
devices, called the master device and slave device.
The pty master and
slave device drivers work together to simulate a terminal connection where
the master provides a connection to the pseudo terminal server process and
the slave provides a terminal device special file access for the terminal
application processes, as depicted below:
----------------
| pty functions |
Application <--> |----------------| <--> Server
Processes | Slave | Master | Process
| (pts) | (ptm) |
----------------
The slave driver,
pts
with
ptem
(STREAMS pty emulation module)
and
ldterm
(STREAMS line discipline module)
pushed on top (not shown for simplicity), provides a terminal interface
as described in
termio(7).
Whereas devices that provide the terminal interface described in
termio(7)
have a hardware device behind them; in contrast, the slave device has another
process manipulating it through the master side of the pty.
Data written on the master device is given to the slave device as input and
data written on the slave device is presented as input on the master device.
In order to use the STREAMS pty subsystem, a node for the
master pty driver
/dev/ptmx
and
N
number of slave pty devices must be installed (see
ptm(7)
for more details on master pty).
When the master device is opened, the corresponding slave
device is automatically locked out.
No user can open that slave device
until its permissions are changed (via the
grantpt()
function) and the device is unlocked (via the
unlockpt()
function).
The user then call the
ptsname()
function to obtain the name of the slave device and
invoke the
open()
system call to open the slave device.
Although only one open is allowed on a master device, multiple opens
are allowed on the slave device.
After both the master and slave have
been opened, the user has two file
descriptors which represent the end points of a full duplex connection
composed of two streams that are automatically connected by the master
and slave devices when they are opened.
The user may then push the
desired modules
(for example,
ptem
and
ldterm,
on
pts
for terminal semantics
and
pckt
on
ptm
for Packet Mode feature).
The master and slave drivers pass all STREAMS messages to their adjacent
drivers.
Only the
M_FLUSH
message needs some special processing because the
read queue of the master is connected to the write queue of the slave
and vice versa.
For example, the
FLUSHR
flag is changed to
FLUSHW
flag and
vice versa whenever a
M_FLUSH
message travels across the master-slave link.
When the master device is closed, an
M_HANGUP
message is sent
to the corresponding slave device which will render that slave device
unusable.
The process on the slave side gets the errno
ENXIO
when attempting a
write()
system call to the slave device file but it will be able to
read any data remaining in the slave stream.
Finally, when all the
data has been read, the
read()
system call will return 0, indicating that the slave can no longer be used.
On the last close of the slave device, a zero-length
M_DATA
message is
sent to the corresponding master device.
When the application on the
master side issues a
read(2)
or
getmsg(2)
system calls, a 0 (zero) is returned.
The user of the master device
may decide to close the master device file, which dismantles the stream
on the master side.
If the master device remains opened,
the corresponding slave device can be opened and used again by another user.
EXAMPLES
The following example shows how
a STREAMS pty master and slave devices are typically opened.
int fd_master, fd_slave;
char *slave;
...
fd_master = open("/dev/ptmx", O_RDWR);
grantpt(fd_master);
unlockpt(fd_master);
slave = ptsname(fd_master);
fd_slave = open(slave, O_RDWR);
ioctl(fd_slave, I_PUSH, "ptem");
ioctl(fd_slave, I_PUSH, "ldterm");
AUTHOR
pts
was developed by HP and OSF.
FILES
- /dev/ptmx
Streams pty master clone device
- /dev/pts/N
Streams pty slave devices (0 <=
N
<
NSTRPTY),
where
NSTRPTY
is a kernel tunable parameter which can be changed via SAM (see
sam(1M)).
SEE ALSO
insf(1M),
sam(1M),
getmsg(2),
ioctl(2),
open(2),
read(2),
write(2),
grantpt(3C),
ptsname(3C),
unlockpt(3C),
ldterm(7),
ptem(7),
ptm(7),
streamio(7),
termio(7).