スレーブ側が使用された後 ( open()
、、、) 、マスター側は終了し、EIO エラーで戻ります。しかし、マスター fd を中断せずにスレーブ側を複数回read()
/できると期待していました。write()
close()
read()
open()
close()
スレーブ側が閉じられた後も、2 つの端を有効なままにしておくことは可能ですか? スレーブ側が閉じられたときに、「マスター」プログラムを実行し続けるにはどうすればよいですか?シーケンスclose()
全体を再実行する必要がありますか?grantpt(); unlockpt(); ptsname();
答え1
ショート:いいえ
長い:擬似端末スレーブ接続は、繋がり、パイプのようなものです。どちらも、カーネルを介してユーザー プロセス間でデータをやり取りする方法です。
片側が閉じられると、接続は失われます。POSIXptsname
の説明では、次のように述べられています。
失敗した場合は
ptsname()
ヌルポインタを返します。これは、fildesが無効なファイル記述子または、スレーブ デバイス名がファイル システムに存在しない場合。
ファイル記述子を閉じると無効になります。
接続を再利用したい場合は、開いているスレーブ ファイル記述子を、スレーブ ファイル記述子を管理するために作成したサーバー アプリケーションなどから新しく作成されたプロセスに渡すなどの回避策を実行できます。
参考文献:
- 7.2 疑似端末(テキストターミナル HOWTO)
close
- ファイル記述子を閉じる(POSIX)grantpt
- スレーブ擬似端末デバイスへのアクセスを許可する(POSIX)pipe
- プロセス間チャネルを作成する(POSIX)ptsname
- スレーブ擬似端末デバイスの名前を取得する(POSIX)unlockpt
- 擬似端末のマスター/スレーブペアのロックを解除する(POSIX)
上記は2016年に書かれたものです。2022年のコメントでは、ティオCGPTピアは、ioctl
アプリケーションが新しいファイル記述子:
(Linux 4.13 以降) fd 内の擬似端末マスターを参照するファイル記述子が指定されている場合は、(指定された open(2) スタイルのフラグを使用して) オープンし、ピア擬似端末スレーブデバイスを参照する新しいファイル記述子を返します。この操作は、スレーブデバイスのパス名が呼び出しプロセスのマウント名前空間を通じてアクセス可能かどうかに関係なく実行できます。
(閉じられたファイル記述子は依然として無効です)。
答え2
他の回答に対するコメントによると、実はそうです。
pty ペアを作成するときは、マスター側のプロセスでスレーブ側を開き、開いたままにしておきます。こうすることで、いくつのクライアントがスレーブを開いたり閉じたりしても、参照カウントがゼロになることはなく、無効になることもありません。