Linux のデバイス ファイルは複数のファイルを指すことができますか?

Linux のデバイス ファイルは複数のファイルを指すことができますか?

Linux のシェル (例: bash) のstdinstdoutおよびファイル記述子はすべて同じデバイス ファイルを指します。たとえば、 の、およびファイル記述子はstderr次のとおりです。stdinstdoutstderrbash

ここに画像の説明を入力してください

これは/dev/tty1、読み取りや書き込みが可能な「実際の」ファイルではなく、ファイルやメモリ内のバッファ、または他の何かを指すデバイス ファイルです。

ここで質問なのですが、これ/dev/tty1は 1 つのファイルだけを指しているのでしょうか、それとも 2 つのファイルを指しているのでしょうか?

私が言いたいのは、()bashから読み取るとき、(または)に書き込むとき、それは( または )から読み取るのか、 (または)に書き込むのかということです。/dev/tty1stdinbash/dev/tty1stdoutstderr同じファイル、または は/dev/tty12 つのファイルを指し、1 つは から読み取るときに使用され/dev/tty1、もう 1 つは に書き込むときに使用されます/dev/tty1か?

答え1

デバイスノードは単一のデバイスは、Linux ではカーネルによって処理されます。bashが から読み取るときは/dev/tty1、最初の端末を管理しているデバイス ドライバーから読み取ります。 に書き込むときは、同じデバイス ドライバーに書き込みます。

答え2

デバイス ファイルは複数のファイルを「指す」わけではありません。デバイス ファイルは単一のファイルを「指す」ことすらありません。デバイス ファイルはドライバーを指します。ドライバーには、読み取りおよび書き込み操作を処理するコードが含まれています。

デバイスから読み取られるデータと書き込まれるデータの間には、必ずしも関係がある必要はありません。関係があるデバイスもあれば、ないデバイスもあります。たとえば、ディスクの場合、特定の位置で読み取られるデータは、その位置に以前書き込まれたデータです。一方、シリアル ポートの場合、デバイスに書き込まれるデータはシリアル ラインで送信され、デバイスから読み取られるデータはシリアル ラインで受信されます。送信されるデータは受信されるデータとは独立しています。

端末はシリアル デバイスに非常によく似ています。実際、歴史的には、物理​​端末は通常シリアル ラインを介して接続されていました。アプリケーションが端末ファイルから読み取る場合、端末ドライバーまたは端末エミュレーターによって送信されたデータを受信します。端末ドライバー/エミュレーターは端末のその側に入力を書き込み、アプリケーションは端末のその側から入力を読み取ります。アプリケーションが端末ファイルに書き込む場合、アプリケーションはデータを送信し、端末ドライバーまたは端末エミュレーターによって読み取られます。アプリケーションは端末のその側に出力を書き込み、端末ドライバー/エミュレーターは端末のその側に出力を読み取ります。

関連情報