ほぼすべてのファイル/dev
はデバイスファイルです。通常のファイルの読み取りと書き込みはディスクまたは他のファイルシステムにデータを保存しますが、デバイスファイルへのアクセスはカーネル内のドライバーと通信し、カーネルは一般にハードウェア(ハードウェアデバイス、したがって名前)と通信します。
デバイスファイルには2つのタイプがあります。ブロックデバイス(b
の出力の最初の文字としてls -l
示されるc
)と文字デバイス(で示される)です。ブロックデバイスとキャラクターデバイスの区別は完全に普遍的ではありません。ブロックデバイスはディスクのようなもので、大きな固定サイズのファイルのように動作します。特定のオフセットでバイトを書き込み、後でそのオフセットでデバイスから読み取ると、そのバイトが返されます。キャラクターデバイスは、バイトを書き込むとすぐに効果があり(シリアルラインで出力されるなど)、バイトを読み取るとすぐに効果がある(シリアルポートから読み取るなど)ほぼすべてのものです。
デバイスファイルの意味は、名前ではなく番号によって決まります(名前はアプリケーションにとって重要ですが、カーネルにとっては重要ではありません)。番号は実際には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バイトを無限/dev/urandom
に返す)(ランダムバイトを無限に返す)です。
いくつかのデバイスファイルには、アクセスするプロセスに依存する意味があります。たとえば/dev/stdin
、現在のプロセスの標準入力を指定します。から開くことは、プロセスの標準入力として開かれた元のファイルを開くこととほぼ同じ効果があります。同様に、/dev/tty
プロセスが接続される端末を指定します。Linuxでは、今日、/dev/stdin
そして友人はキャラクターデバイスとして実装されていませんが、代わりにすべてのファイル記述子を参照できるより一般的なメカニズムへのシンボリックリンクとして実装されています(従来の方法では0、1、2のみではありません); たとえば/dev/stdin
、へのシンボリックリンク/proc/self/fd/0
です。/ dev / fdと/ proc / self / fd /の関係をご覧ください。。
の下に多数のシンボリックリンクがあり/dev
ます。これは、歴史的な理由で発生する可能性があります。デバイスファイルがある名前から別の名前に移動されましたが、一部のアプリケーションはまだ古い名前を使用しています。たとえば、Linuxの下/dev/scd0
へのシンボリックリンク/dev/sr0
です。両方とも最初のCDデバイスを指定します。シンボリックリンクのもう一つの理由は、組織です:Linuxでは、あなたはいくつかの場所で、あなたのハードディスクやパーティションを見つけることができます:/dev/sda
と/dev/sda1
、友人(任意の文字で指定された各ディスク、パーティション、パーティションレイアウトに従って)、 /dev/disk/by-id/*
(ディスクはaで指定されました固有のシリアル番号)、/dev/disk/by-label/*
(人間が選択したラベルで指定されたファイルシステムのパーティション); もっと。シンボリックリンクは、一般的なデバイス名がいくつかある場合にも使用されます。例えば/dev/dvd
は、へのシンボリックリンク/dev/sr0
であるか、/dev/sr1
2つのCDリーダーがあり、2番目のCDリーダーがデフォルトのDVDリーダーである場合のリンクです。
最後に、/dev
伝統的な理由から、の下にいくつかのファイルがあります。すべてのシステムで同じものが見つかるわけではありません。ほとんどの場合、プログラムがログメッセージを出力するために使用/dev/log
するソケットです。/dev/MAKEDEV
は、にエントリを作成するスクリプトです/dev
。最新のLinuxシステムでは、のエントリはudev/dev/
によって自動的に作成され、廃止されました。MAKEDEV
¹これは実際にはLinuxでは事実ではありませんが、この詳細はデバイスドライバー作成者にのみ関係します。