質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

端末へ出力までの流れ 及び 端末ドライバとシェルの役割を区別するための理解

akiyama3284pga
akiyama_pga

総合スコア186

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

1回答

0グッド

0クリップ

239閲覧

投稿2022/12/02 03:15

確認したいことは、

・シェルは単にコマンドを解釈して実行するもの(実際に映像を映し出すものでは一切ない。)
・端末ドライバは各端末の画面自体を形作るもの↓(wslですみませんb
イメージ説明
・シェルの種類により表示される文字配色等に若干差があるのは、
単にシェルがprintf("\x1b[31m");のように実際に表示を行う端末ドライバに注文しているからというだけ。

・とにかく、最終的に対象の端末デバイスファイルに対して書き込みが行われることで、
その端末を担当しているドライバにより実際の物理画面に出力される。

・だからこそ、シェルを通さずとも、単に別端末から echo aaa > /dev/tty2のようにリダイレクトされたとしても(内部で結局wirte("/dev/tty2"))、該当端末を維持したまま、出力が行われる。

・cui環境では、書き込まれる際の流れはおおよそ以下のようになっている。
イメージ説明

かなり突っ込みどころ等あると思いますが、
このあたりをしっかりと区別理解しておきたいと思いますのでよろしくお願いいたします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/12/09 13:23

こちらの質問が複数のユーザーから「問題・課題が含まれていない質問」という指摘を受けました。

回答1

1

ベストアンサー

間違ってます。

色を付けたり、画面クリアしたり、カーソル移動したりのエスケープシーケンスの解釈は、端末ドライバ(sttyコマンドで制御されるような物)ではなくて、端末エミュレーター(xtermとかGNOME-terminalとかWindowsのTeraterm等)の機能です。

WindowsアプリのTeratermやRlogin等でLinuxOSにsshログインした場合、LinuxからTeraterm等にはエスケープシーケンスのまま送られます。LinuxGUI画面の端末を開いた場合も同様。

画面制御にあたり、色を付けるにはどういう制御文字を送るとか、画面クリアの際に何を送るかとかは、端末の機能に依存するので、画面を制御したいプログラムは、環境変数TERMの値でterminfoデータベースを検索して、その端末がどんな機能にどんな制御文字を使うのかを知って、それを送ります。
例えば、dumbというのはほとんど画面制御できない端末の名前なので、export TERM=dumbしてからvimとかlessとか使うと全然駄目です。
端末依存とは言え、ANSIがこのあたりの規格を決めてからは基本的にはその上位互換のはずで、手元の/usr/share/terminfo/以下を見ると、ANSIエスケープシーケンス非互換の古い端末の情報は無さそうです。

投稿2022/12/02 04:32

otn

総合スコア80489

akiyama_pgaを押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

otn

2022/12/02 08:34

tput -T teraterm cup 10 11 | hexdump -C (カーソル移動) tput -T gnome clear | hexdump -C (画面クリア) とかいろいろ。
akiyama3284pga

2022/12/02 10:05

お世話になります。 自分の環境で環境変数TERMの値は、 GUI(gnorm端末): xterm-256color CUI: linux のようになっていました。 ふざけて、export TERM=aaa などとした後に、clearを入力すると、unknown terminal type 'aaa' と出ました。 shellがDB検索かけて該当が見つからなかったためだと思います。 CUI環境でも、clearや色変えができました。 linux(仮想コンソール)がGUIで言う、ターミナルエミュレータと対になる機能を提供していることがわかりました。 また、stty cols 10 としますと、両環境ともに文字の表示されているエリアのみ、横幅が変化しました。 ここではっきり理解しておきたいことがあり、それは、 これら仮想コンソールやターミナルエミュレータと端末(tty)ドライバの関係性につきましてであります。 前2つは端末ドライバをラップするような形になっているのでしょうか? 端末ドライバ --> 仮想コンソール等-> グラフィック 端末ドライバ --> gnorm端末-> グラフィック gnorm端末のウィンドウサイズをマウスで変更しますと、stty colsで変更するエリアもそれに沿うように変化します。これはgnorm端末がウィンドウを変更した際に発火する関数内で、stty cols等をそれに合うように調整しているように思います。
otn

2022/12/02 10:48

> shellがDB検索かけて該当が見つからなかったためだと思います。 shellじゃなくてclearコマンドのプログラムです。 > linux(仮想コンソール)がGUIで言う、ターミナルエミュレータと対になる機能を提供していることがわかりました。 OS起動時に色々メッセージが出てくる画面のことを言っているなら、それは仮想コンソールじゃなくてコンソールです。コンソールは端末の一種で、端末名linuxでterminfo内に持っているエスケープシーケンス解釈の機能を持っています。tput -T linux longname ⇒ linux console > 前2つは端末ドライバをラップするような形になっているのでしょうか? Linux consoleは確信はないですが、おそらくKernelが実現しているので、ややこしいと思います。 WindowsのTeratermだと話は簡単で、端末ドライバとは関係ないです。 Linux側のsshdとTeratermがTCP/IPで通信しているだけ。 おそらくsshdがptyインタフェース(疑似端末)を使っていて、そのptyが端末の機能を持っているはずです。 gnorm端末はおそらくgnome端末プログラムがptyインターフェエースを使っていて、それが端末機能を持っています。このあたりになると私も自信を持って言えることが少ないですね。 > gnorm端末のウィンドウサイズをマウスで変更しますと、 ウィンドウのサイズを変えると、SIGWINCH が発生して、gnome-terminalやさらに、端末(pty)やそこからシェルにも送られるはずで、それぞれがSIGWINCHに対応した処理をします。 ptyはwinsize構造体の中のrowsとcolumnsを更新するし、bashだとシェル変数LINESとCOLUMNSが更新される。 うーん、Xプロトコルとかptyとかを使ったプログラムを書いたことが無いので、このあたりのシグナルの発生と伝わり方もよくわからない。
akiyama3284pga

2022/12/02 12:43 編集

>shellじゃなくてclearコマンドのプログラムです。 その通りでした。 tput -T xterm-256color clearなど実行してみまして、シェルやシェルから起動されるプロセスがどのように色変え等をするのに linuxconsoleやターミナルエミュレータを制御しているのかがよくわかりました。 https://qiita.com/aosho235/items/24bf88462811eccbdec8 上記には、ptyのslave側プロセスにttyドライバが来るような感じで書かれていました。 なるほど、これであればCUIと構図は大筋部分が同じになるな、と思いました。 (slave側とつながるシェルやその他プロセスの制御端末がslave側==pts/2,,,, それらから出力があれば、まずはslave側のttyドライバで基礎インタフェースを作り、マスタ側のターミナルエミュレータで加工した後、実際にxserverに描写命令される。) そもそもターミナルエミュレータ(linux consoleも)は表示(+a加工)と入力だけ担うものなので、じゃあ表示するものは誰から渡されるの?端末ドライバ! みたいにスッキリ考えることが大事だと思いました。 今回の質問では、端末ドライバの役割のあやふやさを解消したかったのですが、かなり千引をすることができました。 関連のシグナルについて、まだ学習が足りないため、これから広げていきたいと思います。
otn

2022/12/02 14:14

面白そうなページありがとうございます。 SIGWINCHを発生させるのはttyか。
akiyama3284pga

2022/12/03 06:01

こちらこそいつもお付き合いいただきありがとうございます。 このあたりの情報はサイトや書籍によりかなり意見が違うようなので、なるべく多くのソースにあたってみて、 共通部分等から自分なりに整理していきたいと思います。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。