1970年代にはハードウェア端末CUIがありました。
私のLinuxボックスには7つの端末エミュレータがあり、GUIは7番目の端末エミュレータ(Ctrl + Alt + F7)を占めています。
たとえば、これは私の最初の端末(Ctrl + Alt + F1)エミュレータです。
$ tty
/dev/tty0
>cat
ユーザースペースでEnterキーを押すと、cat
プロセスはファイルから入力をstdin
受け取るのを待ちます。どのエディタを使用してもファイルを見ること/dev/tty0
はできません。/dev/tty0
Processstdin
とその両方がファイルを処理しています。stdout
cat
/dev/tty0
質問:
一部のエディタを使用して/dev/tty0
ユーザースペースからこの端末ファイルにアクセスできますか?
答え1
端末ファイルにアクセスしています。しかし、あなたが考えるものとは異なります。
ディスクファイルに書き込んでからそのファイルから読み込むと、読み取った内容が書き込んだ内容になります。端末などの特殊ファイルの場合は該当しません。ファイルは、書き込み可能な項目です。作成された内容と読み取った内容との間の接続は、ファイルの特性によって異なります。文字デバイスファイルの場合、通常、リンクはまったくありません。
端末ファイルは、異なる役割を果たす 2 つのオブジェクト、つまり端末自体とユーザーと対話するアプリケーションを関連付けます。ターミナルは、カーネルで表されるハードウェアまたはターミナルエミュレータ(プロセス)です。アプリケーションがデータを書き込むと、端末はデータの読み取りを開始します(通常は何らかの方法でそれをユーザーに表示します)。アプリケーションがデータを読み取ると、データは通常ユーザーが入力する端末から来ます。
あなたの場合、アプリケーションはShell、Cat、Editorなどです。エディタは端末からデータを読み取ろうとしますが、そうであれば入力を待ち、入力が終了するまで正しく反応することも、そうでない場合もあります。 (最初にCtrl + Dを押すとこれを行うことができます。)ライン転送信号の)。その後、端末から読んだ後、以前に持っていたものは提供されません。出力ターミナルに行きます。
コンソールの場合、端末に書き込まれたデータが画面に描画されます。 Linuxコンソールを使用すると、表示された/dev/tty1
テキストをデバイスから再読み込みできます。/dev/vcs1
表示可能な状態のままである限り(画面上の内容と後方にスクロールして使用できる内容のみを取得できます。後方にスクロールして到達できない内容は永遠に失われます)。
これはLinuxターミナルインタフェースで提供される機能です。端末は単にピクセルを描くだけで、テキストは忘れることができます。ほとんどの端末エミュレータは同様の機能を提供しません。
¹実際、ほとんどのファイルはこのようなものですが、すべてではありません。このディレクトリは通常のインタフェースを介して書き込むことができず、多くのUNIXバリアントでは読み取ることができません。一部のデバイスは読み取りまたは書き込みをサポートしていませんioctl
。
答え2
はい、ただし、端末ファイルは通常のファイルではありません。
端末ファイルの拡張属性を一覧表示すると、次のようになります。
$ ls /dev/tty1 -lah
crw--w---- 1 root tty 4, 0 Apr 6 13:07 /dev/tty1
権限セクションの最初の文字は、ファイルが文字特殊デバイスであることを示す文字「c」です。代わりに、汎用ファイルの場合は「-」、ディレクトリの場合は「d」、ブロック特殊デバイスの場合は「b」、シンボリックリンクの場合は「l」、Unixドメインソケットの場合は「s」があります。
LinuxなどのUnixシステムでは、ファイルシステムは実際にカーネルオブジェクトと対話する名前空間に近いです。ここでは、システムのさまざまな部分がそれを明確に参照できるように、さまざまなカーネルオブジェクトの名前を指定します。これらのカーネルオブジェクトには、永続ストレージがサポートする一般的なファイルだけでなく、ハードウェアデバイスやソケットなども含まれます。
文字特殊デバイスは、文字ストリームを読み書きしてユーザー空間と対話するカーネルオブジェクトです。次の操作でアクセスできます。read()
そしてwrite()
システムコール。
read()
たとえば、マイコンピュータでCtrl + Alt + F1を使用すると(マイコンピュータではtty0ではなく/ dev / tty1です)、システムコールを使用するプログラムを使用して仮想コンソールに入力されたすべての内容を読み取ることができますcat
。
- グラフィックシミュレータでは
sudo cat /dev/tty1
- Ctrl+Alt+F1 を使用して仮想コンソールエミュレータに切り替える
- 仮想コンソールエミュレータに何かを入力してください
- グラフィックUIに戻すには、Ctrl + Alt + F7を使用してください。
- グラフィックエミュレータでは、仮想コンソールエミュレータに入力したすべての内容が出力として表示されます。
cat
代わりに、write()
システムコールを使用して仮想コンソールに文字を表示するプログラムを使用することもできますtee
。たとえば、次のようになります。
- グラフィックシミュレータでは
echo "hello world" | sudo tee /dev/tty1
- Ctrl+Alt+F1 を使用して仮想コンソールエミュレータに切り替える
- 仮想コンソールエミュレータに「hello world」が表示されます。
ほとんどのプレーンテキストエディタはファイル形式をチェックし、非伝統的なファイル編集を拒否するようにプログラムされているため、実際には非伝統的な特殊ファイルを開くことを拒否します。プレーンテキストエディタでは、特殊なデバイスを編集することはほとんど意味がないため、「事故」を防ぐためのものです。さらに、ほとんどのプレーンテキストエディタは実際にはwrite()
既存のファイルを呼び出すのではなく、新しいファイルを作成してファイルを置き換えて古いrename()
ファイルを置き換えます。適切な書き込みをサポートするテキストエディタがある場合でも、通常は最初にファイルを切り捨てようとします。もちろん、特殊文字デバイスではサポートされていません。
答え3
1970年代にはハードウェア端末CUIがありました。
しかし、1970年代にはCUIという用語を使用する人は誰もいませんでした。
私のLinuxボックスには7つの端末エミュレータがあり、GUIは7番目の端末エミュレータ(Ctrl + Alt + F7)を占めています。
これらの端末エミュレータは1980年代から利用可能であり、GUIがありませんでした。
一部のエディタを使用して、ユーザースペースからこのターミナルファイル/ dev / tty0にアクセスできますか?
この質問は言葉ではありません。設計上、すべてのファイルはファイルのフルポイントであるユーザースペースからアクセスできます/dev
。特に/dev/tty0
デバイスの場合、「コンテンツ」は一時的であるため編集できません。ここで読み取った内容は最終的にコンソールに入力される内容であり、コンソールに書き込んだ内容は画面に表示される内容です。
答え4
はい、もちろん、UNIXのすべてのデバイスと同様に、すべてのTTYにファイルとしてアクセスできます。この質問を重複する可能性のある質問として表示します。これ答えは、同様の状況で要求されたタスクを実行する方法を非常によく説明します。
この回答を要約すると、echoとcatを使用して他のファイルと同様に他のTTYと対話できます。ファイルを開くときに何も表示されないのは、多くの特殊ファイルと同様に、新しいデータのみを使用できるためです。