pty -
擬似端末インターフェース
擬似端末 (pseudoterminal; "pty"
と略されることもある)
は、
双方向通信チャンネルを提供する仮想キャラクターデバイスのペアである。
チャンネルの一方の端点は
マスタ (master)
と呼ばれ、もう一方の端点は
スレーブ (slave)
と呼ばれる。
擬似端末のスレーブは、伝統的な端末と全く同じ動作をするインターフェースを
提供する。端末に接続されることを想定しているプロセスは擬似端末の
スレーブをオープンすることができ、それ以降はマスタ側をオープン
しているプログラムからそのプロセスを制御することができる。
端末で入力されたのと同じように、
マスタ側に書き込まれた全てのデータは、スレーブ側のプロセスに送られる。
例えば、マスタデバイスに割り込みキャラクター
(通常は control-C)
を書き込むと、
スレーブに接続されているフォアグラウンドプロセスグループに対して
割り込みシグナル (
SIGINT) が生成される。
反対に、擬似端末のスレーブ側に書き込まれた全てのデータは、
マスタ側に接続されているプロセスから読み出すことができる。
Data flow between master and slave is handled asynchronously, much like data
flow with a physical terminal. Data written to the slave will be available at
the master promptly, but may not be available immediately. Similarly, there
may be a small processing delay between a write to the master, and the effect
being visible at the slave.
歴史的に見ると BSD と System V
の2種類の擬似端末の API
が発展してきている。
SUSv1 は System V API
に基づいた擬似端末 API
を標準化しており、
擬似端末を使用する新しいプログラムはすべてこの
API
を採用すべきである。
Linux では BSD 風と
(標準化された) System V
風の擬似端末を提供している。
System V 風の端末は、Linux
システムでは一般に UNIX
98
擬似端末と呼ばれている。
カーネル 2.6.4
以降では、BSD
風の擬似端末は廃止予定とされている。この機能は、カーネル作成時に
CONFIG_LEGACY_PTYS
オプションを無効にすることで無効にできる
(Linux 2.6.30
以降では、メインラインのカーネルでは、このオプションはデフォルトで無効になっている)。新しいアプリケーションでは、UNIX
98
擬似端末を使用すべきである。
未使用の UNIX 98
擬似端末マスタをオープンするには
posix_openpt(3) を呼び出す
(この関数はマスタクローンデバイス
(master clone device),
/dev/ptmx
をオープンする;
pts(4)
を参照)。
プログラム固有の初期化処理を実行し、
grantpt(3)
を使ってスレーブデバイスの所有権や許可を変更し、
unlockpt(3)
を使ってスレーブのロック解除を行うと、
ptsname(3)
が返す名前を渡して
open(2)
を呼び出すことにより
対応するスレーブデバイスをオープンできるようになる。
Linux
カーネルでは、利用できる
UNIX 98
擬似端末の数に上限を設けている。
2.6.3
以前のカーネルでは、この上限はカーネルのコンパイル時の設定
(
CONFIG_UNIX98_PTYS)
である。許可される擬似端末の数は最大
2048 であり、
デフォルトの設定は 256
である。 カーネル 2.6.4
以降では、この上限は
/proc/sys/kernel/pty/max
経由で動的に調整可能となっている。また、
/proc/sys/kernel/pty/nr
で現在使用中の擬似端末の数を取得できる。
この
2つのファイルの詳細は
proc(5) を参照。
BSD
風の擬似端末はあらかじめ作成されたペアとして提供される。その名前は
/dev/ptyXY (マスタ側)、
/dev/ttyXY
(スレーブ側)
である。ここで、 X は
[p-za-e] の
16文字のうちの一文字、
Y は [0-9a-f] の
16文字のうちの一文字である
(X, Y
に使われる文字の正確な範囲は
UNIX
の実装により異なる)。
例えば、
/dev/ptyp1 と
/dev/ttyp1
は BSD
擬似端末ペアを構成する。
プロセスが未使用の擬似端末ペアを見つけるには、
各擬似端末のマスタの
open(2) を試み、open
が成功するまでこれを繰り返す。
マスタを open
すると、対応する擬似端末のスレーブも
open できるようになる
(スレーブの名前は、マスタの名前の
"pty" を "tty"
に置き換えたものである)。
- /dev/ptmx
- UNIX 98
マスタクローンデバイス
- /dev/pts/*
- UNIX 98
スレーブデバイス
- /dev/pty[p-za-e][0-9a-f]
- BSD
マスタデバイス
- /dev/tty[p-za-e][0-9a-f]
- BSD
スレーブデバイス
擬似端末は、ネットワークログインサービス
(
ssh(1),
rlogin(1),
telnet(1)) や
端末エミュレータ (
xterm(1),
script(1),
screen(1),
tmux(1),
unbuffer(1),
expect(1) など)
のアプリケーションで使用されている。
パケットモード操作の制御を行う
TIOCPKT ioctl(2) の説明は
ioctl_tty(2)
に書かれている。
BSD
ioctl(2) の
TIOCSTOP,
TIOCSTART,
TIOCUCNTL,
TIOCREMOTE
はこれまでのところ Linux
では実装されていない。
ioctl_tty(2),
select(2),
setsid(2),
forkpty(3),
openpty(3),
termios(3),
pts(4),
tty(4)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。