Pseudo terminal

In some operating systems, including Unix, a pseudo terminal is a pseudo-device pair that provides a text terminal interface without an associated device, such as a virtual console, computer terminal or serial port. Instead, a process assumes the role of the underlying hardware for the pseudo terminal session.

Contents

BSD PTYs

The slave device file, which generally has a nomenclature of /dev/tty[p-za-e][0-9a-f], has the appearance and supported system calls of any text terminal. Thus it has the understanding of a login session and session leader process (which is typically the shell program).

The master device file, which generally has a nomenclature of /dev/pty[p-za-e][0-9a-f], is the endpoint for communication with the terminal emulator. It receives the control requests and information from the other party over this interface and responds accordingly.

With the typical [p-za-e] naming, there can be at most 256 tty pairs. Also, finding the first free pty master is not entirely race-free. For that reason, modern BSD operating systems, such as FreeBSD, implement Unix98 PTYs.[1]

Unix98 PTYs

BSD PTYs have been made obsolete by Unix98 ptys, which allow race-free access and their number is not limited by nomenclature, only by implementation.

/dev/ptmx is the "pseudo-terminal master multiplexer" which, when opened, causes a slave node /dev/pts/N node to appear (with N being an integer). ptsname(3) can be used to obtain the name of the slave node. The file descriptor, obtained by opening ptmx plus the slave node, form the tty pair.[2]

Creating pseudo terminals

Pseudo terminals can be created using ordinary system calls to open an available master device file, in which a file descriptor to the master file is returned to the calling process. Library functions usually also exist that open the first available master device file and initialize privileges of the corresponding slave device (e.g. openpty(3) on BSD Unix systems).

For example, if the first master device file available is /dev/ptypa, most library functions will return a descriptor for the master (/dev/ptypa) along with a descriptor for the corresponding slave (/dev/ttypa), and establish the permissions of the slave device file in some predefined fashion.

It is generally not allowed to open a pseudo terminal master device that is currently open elsewhere.

Some systems, notably System V derived ones, include a multiplexer device (usually /dev/ptmx) that, when opened, will return a descriptor associated to the first available master device.

New code should always use standardized programming interfaces like posix_openpt(2) to allocate pseudo-terminals.

Applications

Important applications of pseudo terminals include xterm and similar terminal emulators in the X Window System and other window systems (such as the Terminal application in Mac OS X), in which the terminal emulator process is associated with the master device and the shell is associated with the slave. Any terminal operations performed by the shell in a terminal emulator session are received and handled by the terminal emulator process itself (such as terminal resizing or terminal resets). The terminal emulator process receives input from the keyboard and mouse using windowing events, and is thus able to transmit these characters to the shell, giving the shell the appearance of the terminal emulator being an underlying hardware object.

Other important applications include remote login handlers such as ssh and telnet servers, which serve as the master for a corresponding shell, bridged by a pseudo terminal.

Another key application is expect, which allows the automation of arbitrary terminal-bound subprocesses by using a pseudo-terminal to conceal the fact that the subprocess is being controlled by a program and not a user (many programs change their observed behavior otherwise, often because of varying default buffering semantics).

Screen or Tmux are used to add a session context to a pseudo terminal, making for a much more robust and versatile solution. For example, it provides terminal persistence allowing to disconnect from one computer and connect later on from another computer on the net.

Origins

Pseudo terminals were present in the DEC PDP-6 Timesharing Monitor at least as early as 1967, and were used to implement batch processing.[3] They are described in the documentation for the succeeding TOPS-10 on the PDP-10.[4] Other DEC operating systems also had PTYs, including RSTS/E for the PDP-11, as did the third-party TENEX operating system for the PDP-10.

Unix pseudo terminals originated in 1983 during the development of Eighth Edition Unix and were based on a similar feature in TENEX.[5] They were part of the 4.2 release of BSD. AT&T's System V included support for pseudo terminals as a driver in their STREAMS device model, along with the pseudo terminal multiplexer.

See also

References