$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
/dev
とそのサブディレクトリの下のすべてのファイルがすべてデバイスのファイル記述子であるかどうか疑問に思っていましたか?/dev/fd/0
、/dev/stdin
、/proc/self/fd/0
はすべて/dev/pts/2
へのリンクです。l
in lrwx------
がリンクを意味する場合、c
in crw--w----
はどういう意味ですか?/dev
の下のほとんどすべてのファイルは デバイスファイル です。通常のファイルの読み取りと書き込みはデータをディスクまたは他のファイルシステムに保存しますが、デバイスファイルへのアクセスはカーネル内のドライバーと通信し、一般にハードウェア(ハードウェアデバイス、したがって名前)と通信します。
デバイスファイルには、ブロックデバイス(ls -l
の出力の最初の文字としてb
で示される)とキャラクターデバイス(c
で示される)の2種類があります。ブロックデバイスとキャラクターデバイスの違いは、完全に普遍的なものではありません。ブロックデバイスはディスクのようなもので、固定サイズの大きなファイルのように動作します。特定のオフセットでバイトを書き込み、後でそのオフセットでデバイスから読み取ると、そのバイトが返されます。キャラクターデバイスは他のものとほぼ同じで、バイトを書き込むとすぐに影響があり(たとえば、シリアルラインで発生します)、バイトを読み取るとすぐに影響があります(たとえば、シリアルポートから読み取られます)。
デバイスファイルの意味は、名前ではなく番号で決まります(名前はアプリケーションでは重要ですが、カーネルでは重要ではありません)。この番号は実際には2つの番号です。メジャー番号はこのデバイスを担当するドライバーを示し、マイナー番号はドライバーが複数のデバイスを駆動できるようにします¹。これらの数値はls -l
リストに表示され、通常はファイルサイズがわかります。例えば。 brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→このデバイスはメジャー8、マイナー0です。
/dev
の一部のデバイスファイルは、ハードウェアデバイスに対応していません。すべてのUNIXシステムに存在するものは/dev/null
です。書き込みを行っても効果はなく、読み取りを行ってもデータが返されることはありません。シェルスクリプトでは、コマンドからの出力を無視する場合(>/dev/null
)または入力なしでコマンドを実行する場合(</dev/null
)に便利です。その他の一般的な例は/dev/zero
(nullバイトを返すad infinitum) /dev/urandom
(これは返すランダムバイトad infinitum)。
いくつかのデバイスファイルは、それにアクセスするプロセスに依存する意味を持っています。たとえば、/dev/stdin
は現在のプロセスの標準入力を示します。 fromを開くことは、プロセスの標準入力として開かれた元のファイルを開くこととほぼ同じ効果があります。同様に、/dev/tty
は、プロセスが接続されている端末を示します。 Linuxでは現在、/dev/stdin
とその仲間はキャラクターデバイスとして実装されていませんが、代わりに、すべてのファイル記述子を参照できるより一般的なメカニズムへのシンボリックリンクとして実装されています(従来の方法);たとえば、/dev/stdin
は/proc/self/fd/0
へのシンボリックリンクです。 / dev/fdは/ proc/self/fd /とどのように関連していますか? を参照してください。
/dev
の下に多数のシンボリックリンクがあります。これは歴史的な理由で発生する可能性があります。デバイスファイルがある名前から別の名前に移動されましたが、一部のアプリケーションは古い名前を使用しています。たとえば、/dev/scd0
はLinuxでの/dev/sr0
へのシンボリックリンクです。どちらも最初のCDデバイスを指定します。シンボリックリンクのもう1つの理由は組織です。Linuxでは、ハードディスクとパーティションが/dev/sda
と/dev/sda1
といくつかの場所にあります(各ディスクは任意の文字で指定されており、パーティションレイアウト)、/dev/disk/by-id/*
(一意のシリアル番号で指定されたディスク)、/dev/disk/by-label/*
(ファイルシステムを含むパーティション、人が選択したラベルで指定)。もっと。シンボリックリンクは、一般的なデバイス名が複数ある場合にも使用されます。たとえば、/dev/dvd
は/dev/sr0
へのシンボリックリンクである可能性があります。2つのCDリーダーがあり、2つ目のCDリーダーがデフォルトのDVDリーダーである場合は、/dev/sr1
へのリンクである可能性があります。
最後に、従来の理由により、/dev
の下にいくつかのファイルが見つかる可能性があります。すべてのシステムで同じとは限りません。ほとんどのuniceでは、/dev/log
は socket であり、プログラムがログメッセージを出力するために使用します。 /dev/MAKEDEV
は、/dev
にエントリを作成するスクリプトです。最近のLinuxシステムでは、/dev/
のエントリは dev によって自動的に作成され、MAKEDEV
は廃止されました。
¹これは実際にはLinuxではもはや当てはまりませんが、この詳細はデバイスドライバーの作成者にのみ関係します。
/dev/
_の目的です。/dev/stdin
_の例のように、命名スキーム間の互換性のために、作業環境に必要な場合があります。これはではありません静的にポイントします_/dev/pts/2
_または他の-別の端末に切り替えるだけで、表示されます。 _/dev/stdin
_はcurrent端末セッションの標準入力です。これは、シンボリックリンクにする必要がある理由の例でもあります。man mknod
_および_info coreutils 'mknod invocation'
_を参照してください。一般に、c
は文字デバイスタイプを表します。最初の質問では、これらはファイル記述子ではなく、デバイスファイルです。 (別名「開発ノード」)
これらのファイルは、メジャー番号とマイナー番号を使用してデバイスを処理しているドライバーにバインドされています。 (たとえば、ls
出力の "136、2"は、メジャー番号136にバインドされたデバイスドライバーを指し、そのドライバーによって処理されるデバイス#2を指定します。)
ls -l
の出力の最初の文字は、デバイスファイルの場合のデバイスのタイプです。 「c」の場合はキャラクター型デバイス、「b」の場合はブロック型デバイスです。
2番目の質問については、rozcietrzewiaczによる上記の回答を参照してください。