openpty, login_tty, forkpty -
端末ユーティリティ関数
#include <pty.h>
int openpty(int *amaster, int *aslave, char *name,
const struct termios *termp,
const struct winsize *winp);
pid_t forkpty(int *amaster, char *name,
const struct termios *termp,
const struct winsize *winp);
#include <utmp.h>
int login_tty(int fd);
-lutil でリンクする。
openpty()
関数は、使用可能な疑似端末
(pseudoterminal) を見つけて、
マスタとスレーブのファイルディスクリプターを
amaster と
aslave
に入れて返す。
name が
NULL
でない場合、スレーブのファイル名が
name に返される。
termp
が NULL
でない場合、スレーブの端末パラメーターは
termp
の値に設定される。
winp が NULL
でない場合、スレーブのウインドウサイズは
winp に設定される。
login_tty()
関数は、ファイルディスクリプター
fd
で参照される端末にログインする準備をする
(
fd
は実際の端末デバイスでも、
openpty()
で返される疑似端末のスレーブでもよい)。
具体的には、新しいセッションを作成し、
fd
を呼び出し元のプロセスの制御端末とし、
呼び出し元の標準入力・標準出力・標準エラーのストリームを
fd に設定した後、
fd
をクローズする。
forkpty() 関数は
openpty(),
fork(2),
login_tty()
を組み合わせ、疑似端末を操作する新しいプロセスを生成する。疑似端末のマスタ側を参照するファイルディスクリプターは
amaster で返される。
name
が NULL
でない場合には、スレーブのファイル名を返すのに
name
が指すバッファーが使用される。
termp と
winp 引数は、NULL
でなければ、
疑似端末のスレーブ側の端末属性とウインドウサイズを決定する。
openpty(),
login_tty(),
forkpty()
の呼び出しが成功しなかった場合、
-1 が返されて、
errno
はエラーを示す値に設定される。
成功した場合、
openpty(),
login_tty() および
forkpty()
の子プロセスは 0
を返し、
forkpty()
の親プロセスは子プロセスのプロセス
ID を返す。
以下の場合に
openpty()
は失敗する:
- ENOENT
- 使用可能な端末がない。
ioctl(2) が
fd
を呼び出し元のプロセスの制御端末に設定するのに失敗した場合、
login_tty() は失敗する。
openpty() と
fork(2)
のどちらかが失敗した場合、
forkpty() は失敗する。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
forkpty(), openpty() |
Thread safety |
MT-Safe locale |
login_tty() |
Thread safety |
MT-Unsafe race:ttyname |
これらは BSD
の関数であり、 glibc2
に存在する。 POSIX
での標準化はされていない。
glibc 2.8 で、
openpty() と
forkpty()
の構造体へのポインターの引数に
const
修飾子が追加された。
2.0.92
より前のバージョンの
glibc では、
openpty() は BSD
疑似端末ペアのファイルディスクリプターを返す。
2.0.92 以降の glibc では、
openpty() はまず Unix 98
疑似端末ペアをオープンしようとし、それに失敗した場合に
BSD
疑似端末ペアのオープンへと移行する。
誰も
name
に対してどのくらい大きさを予約しておけばいいか分からない。
したがって、NULL でない
name を引数として
openpty()
や
forkpty()
を呼び出すのは安全であるとは言えない。
fork(2),
ttyname(3),
pty(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。