Linuxターミナルはどのように機能しますか?


32

ターミナルを立ち上げて実行可能ファイルを呼び出すと(単純化のために行指向であると想定)、実行可能ファイルからコマンドへの応答が返されます。これはどのようにあなた(ユーザー)に印刷されますか?端末は次のようなことをしpexpectますか?(出力待ちのポーリング)または何ですか?どのように出力が印刷されるか通知されますか?そして、端末はどのようにプログラムを開始しますか?(それはpythonのos.fork()に似ていますか?)ターミナルがどのように機能するのか戸惑っています。ターミナルエミュレーターで遊んでいますが、この魔法がどのように機能するかまだわかりません。konsole(kde)とyaakuake(おそらくkonsoleを使用)のソースを調べていますが、そのすべての魔法がどこで発生するかわかりません。


6
見てみましょうシンプルな端末エミュレータ簡単なシェルを持つ単純なおもちゃのオペレーティングシステム(およびその本の最初の15かそこらのページを)。また、関連する質問に対するこの回答をお読みください。

2
このリンクは、端末の件名とttyの履歴にも興味を持ってい

@nwildnerクール、
マイク

回答:


30

もともとあなたはただの端末を持っていました-最初は実際にはテレタイプライター(電気タイプライターに似ていますが、紙のロール)(したがって/ dev / tty-TeleTYpers)でしたが、後でスクリーン+キーボードコンボ-キーコードを送信しましたコンピューターに、コンピューターは端末に手紙を書いたコマンドを送り返しました(つまり、端末はローカルエコーがなかったため、コンピューターは端末にユーザーが入力した内容を書き込むように指示する必要がありました)-これが理由の1つですなぜこれほど多くの重要なUnixコマンドがそれほど短いのか。ほとんどの端末はシリアル回線で接続されていましたが、(少なくとも)1つはコンピューター(多くの場合同じ部屋)に直接接続されていました-これがコンソールでした。「コンソール」で作業することを信頼された少数のユーザーのみが信頼されました(これは、多くの場合、シングルユーザーモードで使用可能な唯一の「端末」でした)。

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

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

「コンソール」(キーボード+スクリーン)と「コンピューター」が単一のユニットであるPCでは、代わりに「仮想端末」(LinuxではAlt + F1からAlt + F6のキー)が得られましたが、これらも古いスタイルの端末を模倣します。もちろん、Unix / Linuxが1人のユーザーがよく使用するデスクトップオペレーティングシステムになりつつある今、ユーザーは以前はシリアル回線で接続された端末を使用していた「コンソール」でほとんどの作業を行います。


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


そして、ダムシリアルターミナルとXtermsの間にen.wikipedia.org/wiki/Blit_(computer_terminal)–
sendmoreinfo

31

「ターミナルを開く」とき、xterm、gnome-terminal、lxterm、konsoleなどのターミナルエミュレータプログラムを起動しています…

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

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

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

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

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

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


ここで説明する簡単な例の1つは、コマンドのBusyBoxの実装ですscript。ここで、xgetpty関数はを使用した作業の中核です/dev/ptmx
ルスラン

@Tim英語があなたの母国語ではないことを感謝しています。ただし、投稿を編集する場合は、間違えないようにしてください。理解できない場合は編集しないでください。また、強調表示する必要のないものを強調するために、太字を使用しないでください。
ジル 'SO-悪であるのをやめる'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.