web-dev-qa-db-ja.com

Linux端末はどのように機能しますか?

端末を起動して実行可能ファイルを呼び出すと(単純化のために行指向のものを想定)、実行可能ファイルからコマンドへの応答が返されます。これはどのようにしてあなた(ユーザー)に印刷されますか?端末はpexpectのようなことをしますか? (投票を待つ世論調査)または何?印刷される出力の通知はどのように取得されますか?そして、端末はどのようにプログラムを起動しますか? (それはpythonのos.fork()に似ていますか?)端末がどのように動作するのか困惑しています。ターミナルエミュレータで遊んでいましたが、この魔法のすべてがまだ動作しません。私はkonsole(kde)とyakuake(おそらくkonsoleを使用している)のソースを調べています。

33
mike

もともとはダム端末しかありませんでした-最初は実際にはテレタイプライター(電気タイプライターに似ていますが、ロール紙が付いています)(したがって/ dev/tty-TeleTYpers)ですが、後でscreen + keyboard-combos-キーコードを送信しただけですコンピュータに送信し、端末に文字を書き込むコマンドをコンピュータが送り返しました(つまり、端末にはローカルエコーがありませんでした。コンピュータは、ユーザーが端末に入力したものを書き込むように端末に命令する必要がありました)-これが理由の1つですなぜそれほど多くの重要なUnixコマンドがとても短いのか。ほとんどの端末はシリアル回線で接続されていましたが、(少なくとも)1台はコンピューター(多くの場合同じ部屋)に直接接続されていました。これがコンソールでした。 「コンソール」での作業が信頼されているのは、ごく一部のユーザーだけです(これは、多くの場合、シングルユーザーモードで使用できる唯一の「ターミナル」でした)。

後に、画面とグラフィック画面カード、キーボード、マウス、シンプルなプロセッサを備えたいくつかのグラフィカル端末(いわゆる「xterminal」、xterm-プログラムと混同しないでください)もありました。 Xサーバーを実行するだけです。彼らは自分で計算を行わなかったため、Xクライアントは接続先のコンピューターで実行されました。一部にはハードディスクがありましたが、ネットワーク経由で起動することもできました。それらは、PCが非常に安価で強力になる前の1990年代初頭に人気がありました。

「ターミナルエミュレータ」-xtermkonsoleなどのプログラムで開く「ターミナルウィンドウ」-このようなダムターミナルの機能を模倣しようとします。また、PuTTY(Windows)のようなプログラムは端末をエミュレートします。

PCでは、「コンソール」(キーボード+画面)と「コンピュータ」が単一のユニットになっているため、代わりに「仮想端末」(LinuxではAlt + F1〜Alt + F6のキー)を使用しましたが、これらも同様です。古いスタイルの端末を模倣します。もちろん、Unix/Linuxがシングルユーザーがよく使用するデスクトップオペレーティングシステムになり、ほとんどの作業は「コンソールで」行われるようになりました。


もちろん、プログラムを起動するのはシェルです。そして、fork-systemcall(C言語)を使用して、環境設定で自身のコピーを作成し、次にexec-systemcallを使用して、このコピーを実行したいコマンドに変換します。シェルは、コマンドが完了するまで(コマンドがバックグラウンドで実行されない限り)一時停止します。このコマンドはシェルからstdin、stdout、およびstderrの設定を継承するため、コマンドは端末の画面に書き込み、端末のキーボードから入力を受け取ります。

31
Baard Kopperud

「ターミナルを開く」とは、xterm、gnome-terminal、lxterm、konsoleなどのターミナルエミュレータプログラムを起動することです。

ターミナルエミュレータが最初に行うことの1つは、 pseudo terminal (しばしばpseudo-ttyまたは略してptyと呼ばれる)を割り当てることです。 ptyは、ペアの キャラクターデバイスファイル です。ターミナルエミュレーターが開く側であるptyマスターと、ターミナル内で実行されているプログラムが開く側であるptyスレーブです。ほとんどの現代のuniceでは、マスターは /dev/ptmx (すべてのターミナルエミュレータが開いている)、スレーブは/dev/pts/NUMBER。疑似端末のカーネルドライバは、どのプロセスが各スレーブデバイスのマスターを制御しているかを追跡します。端末エミュレータは、マスターデバイスの ioctl を使用して、対応するスレーブへのパスを取得できます。

ターミナルエミュレーターがマスターデバイスを開くと、サブプロセス(通常はシェルですが、ターミナルエミュレーターを呼び出して決定するユーザー次第です)を開始します。エミュレータはこれを通常の方法で実行してプログラムを呼び出します。

  • fork 子プロセス、
  • ファイル記述子0、1、2(標準入力、標準出力、エラーストリーム)でスレーブptyデバイスを開きます。
  • execute シェルまたは子プロセス内の他のプログラム。

子(またはその他のプロセス)がptyスレーブに書き込むと、エミュレーターはptyマスターの入力を確認します。

逆に、エミュレーターがマスターデバイスに書き込む場合、それはスレーブの入力として認識されます。

Expectはまったく同じように機能します。 Expectとxtermなどのターミナルエミュレーターの違いは、プログラムに供給する入力(スクリプトとキーボード入力)を取得する場所と、出力(ログファイルまたはパーサーとウィンドウ内のテキストを描画)で何を行うかです。