$ 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
にある場合はどういう意味ですか?lrwx------
c
crw--w----
答え1
ほぼすべての/dev
ファイルデバイスファイル。通常のファイルの読み書きはディスクや他のファイルシステムにデータを保存しますが、デバイスファイルへのアクセスはカーネルのドライバと通信し、通常はハードウェア(ハードウェアデバイス、したがって名前)と通信します。
b
デバイスファイルには、ブロックデバイス(出力の最初の文字として表示ls -l
)と文字デバイス(として表示c
)の2種類があります。ブロックデバイスと文字デバイスの区別は完全に普遍的ではありません。ブロックデバイスはディスクと同じで、大きな固定サイズファイルのように動作します。特定のオフセットでバイトを書き込み、そのオフセットからデバイスから読み取ると、このバイトが得られます。文字デバイスは、バイト書き込みが直接的な影響を及ぼし(たとえばシリアルラインから放出される)、バイトを読み取ることも直接的な影響を与える(たとえばシリアルポートから読み取られる)、他のデバイスと非常によく似ています。
デバイスファイルの意味は名前ではなく番号で決まります(名前はアプリケーションにとって重要ですが、カーネルには重要ではありません)。数字は実際には2つの数字です。どのドライバがデバイスを担当しているかを示すメジャー番号と、ドライバが複数のデバイスを駆動できるようにするマイナー番号です。この数字はls -l
通常、ファイルサイズを確認できるリストに表示されます。たとえば、brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→このデバイスのプライマリデバイスは8で、セカンダリデバイスは0です。
以下のデバイスファイルの一部は、/dev
ハードウェアデバイスに対応していません。すべてのUNIXシステムには1つがあります/dev/null
。ここに書いても何の効果もなく、読み込んでもデータは返されません。シェルスクリプトでは、これはコマンドの出力を無視>/dev/null
したり()入力なしでコマンドを実行したい場合()に便利です。</dev/null
他の一般的な例は次のとおりです/dev/zero
。無期限)/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/*
(固有のシリアル番号で)、/dev/disk/by-label/*
(手動で選択されたラベルで指定されたファイルシステムを持つパーティション)シンボリックリンクはシンボリックリンクにすることができます/dev/dvd
。または、2つのCDリーダーがあり、2番目のリーダーがプライマリDVDリーダーの場合は、共通のデバイス名が複数のデバイス名のいずれかである場合にも使用されます。例えば/dev/sr0
/dev/sr1
/dev
最後に、従来の理由により、以下にいくつかの追加ファイルがあります。すべてのシステムで同じコンテンツを見つけることはできません。ほとんどの unice では/dev/log
そうです。ソケットログメッセージの発行に使用されるプログラムです。/dev/MAKEDEV
に項目を生成するスクリプトです/dev
。最新のLinuxシステムでは、エントリは/dev/
次のコマンドによって自動的に生成されます。ウデブ、昔ながらですMAKEDEV
。
¹Linuxでは実際には適用されませんが、この詳細はデバイスドライバの作成者にとってのみ重要です。
答え2
- はい。直接でもシンボリックリンクでも、それが目的です
/dev/
。 - さまざまな目的のために:時には命名システム間の互換性のために、時には作業環境に必要です
/dev/stdin
。いいえより静的それとも/dev/pts/2
別の端末に切り替えるとわかります。/dev/stdin
標準入力です現在の端末セッション。これはシンボリックリンクが必要な理由の例でもあります。 man mknod
とを参照してくださいinfo coreutils 'mknod invocation'
。通常、c
文字デバイスの種類を表します。
答え3
最初の質問はファイル記述子ではなくデバイスファイルです。 (別名「開発ノード」)
これらのファイルは、メジャーとマイナーのデバイス番号を使用してデバイスを処理するドライバにバインドされます。 (たとえば、ls
出力の「136、2」は、メインデバイス番号136にバインドされたデバイスドライバを表し、そのドライバが処理するデバイス#2を指定します。)
デバイスファイルの場合、出力の最初の文字ls -l
はデバイスタイプです。 「c」の場合は文字デバイス、「b」の場合はブロックデバイスです。
2番目の質問については、上記のrozcietrzewiaczの回答を参照してください。