web-dev-qa-db-ja.com

ターミナルエミュレータウィンドウを閉じるとき、スレーブ側またはマスター側の最後のファイル記述子は閉じられていますか?

Linuxプログラミングインターフェイスは、SIGHUPが端末の制御プロセスに送信されると言っています

ワークステーションでターミナルウィンドウが閉じられたとき。これは、端末ウィンドウに関連付けられている疑似端末のマスター側で最後に開いたファイル記述子が閉じているために発生します。

私の理解では、ターミナルウィンドウはスレーブ側用に作成され、マスター側は複数のスレーブ側を持つことができます。したがって、ターミナルウィンドウが閉じている場合は、ターミナルウィンドウに関連付けられている疑似端末のスレーブ側の最後に開いているファイル記述子が閉じていることを意味するだけです。なぜ引用は「マスター」側を言うのですか?

ありがとう。

1
Tim

私の理解では、ターミナルウィンドウはスレーブ側用に作成され、マスター側は複数のスレーブ側を持つことができます。

疑似端末には、常に1つのマスター側と1つのスレーブ側しかありません。これは、いくつかの追加の操作を伴う単なる双方向パイプです[1]。

複数のウィンドウ/タブを開くことができるターミナルエミュレータも、複数の疑似ttyマスターを処理します。

別の answer ですでに説明したように、ターミナルエミュレータは、ユーザーがウィンドウまたはそのタブの1つを閉じようとしたときに独自のことを実行できます。たとえば、xtermはptyのマスター側を閉じませんが、SIGHUPをttyのプロセスグループに送信し、プロセスが終了したときにのみウィンドウを破棄(および終了)します。 start in inが終了したか、ptyのマスター部分を使用できなくなりました(たとえば、スレーブ側へのすべてのハンドルが閉じられたため)。

[1]。 [〜#〜] streams [〜#〜] のSystemVシステムでは、これらの追加の操作はモジュール式であり、ioctl(I_Push)で「プッシュ」する必要があります。 Linuxおよび* BSDでは、それらはハードワイヤードです。また、ptyの動作は完全に標準化されていません。マスターのないスレーブから読み取ろうとしたり、その逆を試みたりすると、LinuxではEIOで失敗しますが、FreeBSDでは0(EOF)を返します。

3
mosvy