Unixライクなシステムで疑似端末が別個の機能であるのはなぜですか?ターミナルエミュレータを実装するために、パイプとFIFOのペアよりも優れている理由は何ですか?
端末は他の形式のI/Oとは異なり、端末エミュレーターはそれ自体を端末として提示する必要があります。
端末(疑似端末を含む)には、行の長さやサポートされている制御シーケンスなどの特定の属性があります。プログラムはこれらを要求できます。たとえば、一般にls
は、出力が端末に送られるかどうかを判断し、端末に一致するように色と表を調整します。
これをテストできます:ls | cat
は個別の列を提供しません。疑似端末は、端末エミュレーターに適切な値を渡すために使用されます。
別の例として、Sudo
やssh
のようなプログラムは、セキュリティ上の理由から、端末から直接パスワードを読み取るため、パイプで接続することはできません。
端子は、プロセスを制御するために使用されます。 ^C
を押すと、端末はSIGINT
をフォアグラウンドプロセスに送信します。これが端末の仕事です。これは、^C
のようなものが機能するためには、端末がなければならないことを意味します。
同様に、ターミナル(または最新のシステムではターミナルエミュレータのウィンドウを閉じる)で電話を切ると、それに関連付けられているすべてのプロセスにSIGHUP
が送信されます。
疑似端末はこれを処理しますが、パイプのペアは処理できません。
一般に、デーモンを除くすべてのプロセスには制御端末があります。 ps
を使用して、どのプロセスがどの端末に属しているかを知ることができます。