The pseudo-tty subsystem simulates a terminal connection,
where the master side represents the terminal and the slave represents the
user process's special device end point. In order to use the pseudo-tty subsystem,
a node for the master side driver /dev/ptmx and N number of nodes
for the slave driver must be installed. See pts(7D).
The master device is set up as a cloned device where its major device number
is the major for the clone device and its minor device number is the major
for the ptm driver. There are no nodes in the file system
for master devices. The master pseudo driver is opened using the open(2) system call with /dev/ptmx
as the device parameter. The clone open finds the next available minor device
for the ptm major device.
A master device is available only if it and its corresponding slave
device are not already open. When the master device is opened, the corresponding
slave device is automatically locked out. 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 are the
end points of a full duplex connection composed of two streams which are automatically
connected at the master and slave drivers. The user may then push modules
onto either side of the stream pair.
The master and slave drivers pass all messages to their adjacent queues.
Only the M_FLUSH needs some processing.
Because the read queue of one side is connected to the write queue of the
other, the FLUSHR flag is changed
to the FLUSHW flag and vice versa.
When the master device is closed an M_HANGUP message is sent to the slave device which will render the device
unusable. The process on the slave side gets the errno EIO
when attempting to write on that stream but it will be able to read any data
remaining on the stream head read queue. When all the data has been read, read() returns 0 indicating that the stream can no longer be used.
On the last close of the slave device, a 0-length message is sent to the master
device. When the application on the master side issues a read()
or getmsg() and 0 is returned, the user of the master device
decides whether to issue a close() that dismantles the
pseudo-terminal subsystem. If the master device is not closed, the pseudo-tty
subsystem will be available to another user to open the slave device.
If O_NONBLOCK or O_NDELAY is set, read on the master side
returns -1 with errno set to EAGAIN if no data
is available, and write returns -1 with errno set to EAGAIN if there is internal flow control.
|