1970 年代には、ハードウェア端末 CUI がありました。
現在、私の Linux ボックスには 7 つのターミナル エミュレーターがあり、GUI は 7 番目のターミナル エミュレーター (Ctrl+Alt+F7) を占有しています。
たとえば、これは私の最初のターミナル(Ctrl + Alt + F1)エミュレータです
$ tty
/dev/tty0
>cat
ユーザー空間で ENTERすると、cat
プロセスはファイルstdin
からの入力を受け取るまで待機します。どのエディターを使用してもファイル/dev/tty0
を表示できませんでした。/dev/tty0
プロセスstdin
とstdout
の両方がファイルを操作しています。cat
/dev/tty0
質問:
何らかのエディタを使用すると、この端末ファイルは/dev/tty0
ユーザー空間からアクセス可能でしょうか?
答え1
常にターミナル ファイルにアクセスしています。しかし、これはおそらくあなたが考えているような動作をしません。
ディスク ファイルに書き込み、その後読み取る場合、読み取った内容は書き込んだ内容と同じです。これは、端末などの特殊なファイルには当てはまりません。ファイルとは、書き込みと読み取りが可能なものです¹。書き込まれる内容と読み取られる内容のリンクは、ファイルの性質によって異なります。キャラクタ デバイス ファイルの場合、通常、リンクはまったくありません。
ターミナル ファイルは、異なる役割を果たす 2 つのエンティティ (ターミナル自体と、ユーザーと対話するアプリケーション) を接続します。ターミナルは、カーネルによって表されるハードウェア、またはプロセスであるターミナル エミュレーターのいずれかです。アプリケーションがデータを書き込むと、ターミナルはそれを読み取ります (通常は何らかの方法でユーザーに表示します)。アプリケーションがデータを読み取ると、データはターミナルから取得されます (通常はユーザーからの入力です)。
あなたの場合、アプリケーションはシェル、cat、エディタなどです。エディタはターミナルから読み込もうとしますが、その場合、入力を待っており、入力の終わり(行の先頭で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()
システムコール。
たとえば、私のマシンでは Ctrl+Alt+F1 (私のマシンでは tty0 ではなく /dev/tty1) があり、read()
次のような syscallを使用するプログラムを使用して、仮想コンソールに入力されている内容を読み取ることができますcat
。
- グラフィカルエミュレータでは、
sudo cat /dev/tty1
- Ctrl+Alt+F1で仮想コンソールエミュレーターに切り替えます
- 仮想コンソールエミュレータに何かを入力します
- Ctrl+Alt+F7 でグラフィカル UI に戻ります
- グラフィカルエミュレータでは、仮想コンソールエミュレータで入力したものが出力として表示されます。
cat
逆に、write()
次のような syscallを使用するプログラムを使用して、仮想コンソールに文字を表示することもできますtee
。
- グラフィカルエミュレータでは、
echo "hello world" | sudo tee /dev/tty1
- Ctrl+Alt+F1で仮想コンソールエミュレーターに切り替えます
- 仮想コンソールエミュレータでは、「hello world」が表示されます
通常のテキスト エディターのほとんどは、ファイルの種類をチェックし、通常以外のファイルの編集を拒否するようにプログラムされているため、通常以外の特殊ファイルを実際に開くことを拒否します。これは、通常のテキスト エディターで特殊デバイスを編集しても意味がないため、「事故」を防ぐためです。さらに、通常のテキスト エディターのほとんどは、write()
既存のファイルを呼び出すだけでなく、新しいファイルとスワップ ファイルに書き込み、rename()
古いファイルを置き換えます。インプレース書き込みをサポートするテキスト エディターを使用している場合でも、通常は最初にファイルを切り捨てようとしますが、これはもちろん特殊文字デバイスではサポートされていません。
答え3
1970 年代には、ハードウェア端末 CUI がありました。
しかし、70 年代には CUI という用語を使用する人は誰もいませんでした。
現在、私の Linux ボックスには 7 つのターミナル エミュレーターがあり、GUI は 7 番目のターミナル エミュレーター (Ctrl+Alt+F7) を占有しています。
これらの端末エミュレーターは 80 年代にすでに利用可能でしたが、GUI はありませんでした。
何らかのエディタを使用して、この端末ファイル /dev/tty0 はユーザー空間からアクセス可能でしょうか?
この質問は意味をなさない。すべてのファイルは設計上、ユーザー空間でアクセス可能であり、それがファイルの本質であり、特に 内のファイルはそうである/dev
。/dev/tty0
デバイスであるため、その「コンテンツ」は本質的に一時的なものであるため、編集することはできません。そこから読み取った内容は、最終的にコンソールに入力したものとなり、そこに書き込んだ内容は画面に表示されます。
答え4
はい、UNIXのデバイスと同様に、どのTTYにもファイルとしてアクセスできます。この質問は重複の可能性があるとマークします。これこの回答では、同様の状況であなたが尋ねていることをどのように行うべきかをうまく説明しています。
その回答を要約すると、他のファイルと同様に、echo と cat を使用して他の TTY と対話できます。ファイルを開いたときに何も表示されなかった理由は、多くの特殊ファイルと同様に、新しいデータのみが利用可能であるためです。