スレーブ側で(open()
、、、、)を使用した後、マスター側で完了し、EIOエラーを返しますread()
。しかし、私はマスターfdを妨げることなく何度もスレーブを実行できると期待しています。write()
close()
read()
open()
close()
スレーブ後の両端はすべて有効に保つことができますかclose()
?スレーブの終了時に「メイン」プログラムを実行し続けるにはどうすればよいですか?完全なシーケンスgrantpt(); unlockpt(); ptsname();
を再実行する必要がありますか?
答え1
短い:なし
長:疑似端子スレーブ接続は端子の一端です。つながる、パイプのように。どちらもカーネルを介してユーザープロセス間でデータを送受信する方法です。
一方の端が閉じると接続が切断されます。ptsname
POSIXの説明は次のとおりです。
失敗した場合は
ptsname()
NULLポインタを返す必要があります。 fildesが次の場合、これが発生する可能性があります。無効なファイル記述子または、スレーブデバイス名がファイルシステムに存在しない場合。
ファイル記述子が閉じられると無効です。
接続を再利用するには、開いたスレーブファイル記述子を新しく作成されたプロセス(たとえば、スレーブファイル記述子を管理するために作成したサーバーアプリケーション)に渡すなど、いくつかの回避策を使用できます。
追加資料:
- 7.2 擬似端子(テキスト端末操作ガイド)
close
- ファイル記述子を閉じます。(POSIX)grantpt
- スレーブ擬似端末装置へのアクセス許可(POSIX)pipe
- プロセス間チャネルの作成(POSIX)ptsname
- スレーブ擬似端末装置の名前を取得します。(POSIX)unlockpt
- 擬似ターミナルマスター/スレーブペアのロック解除(POSIX)
上の記事は2016年に書いたものです。言及された2022年のコメントTIOCGPPEERioctl
、これはアプリケーションが以下を取得できるようにする機能です。新しいファイル記述子:
(Linux 4.13以降)疑似ターミナルマスターデバイスを参照するfdのファイル記述子が与えられたら(与えられたopen(2)スタイルフラグを使用して)、それを開き、ピア擬似ターミナルスレーブデバイスを参照する新しいファイル記述子を返します。これは、呼び出しプロセスのマウントネームスペースを介してスレーブデバイスのパス名にアクセスできるかどうかに関係なく実行できます。
(閉じたファイル記述子はまだ無効です。)
答え2
他の答えに対するコメントに基づいて:はい。実際にそうです。
ptyペアを作成するときは、マスタープロセスがスレーブ側を開いて開いたままにします。これにより、どのくらいのクライアントがスレーブデバイスを開閉しても、参照数がゼロに達せず、無効化されません。