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

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

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

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

Q&A

解決済

1回答

702閲覧

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

akiyama3284pga

総合スコア186

Linux

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

0グッド

0クリップ

投稿2022/12/02 03:15

確認したいことは、

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

間違ってます。

色を付けたり、画面クリアしたり、カーソル移動したりのエスケープシーケンスの解釈は、端末ドライバ(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

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問