Linuxにはいくつかの特別なファイルがありますが、実際にはファイルではありません。
最も顕著で明確な例は、dev
「ファイル」フォルダにあります。たとえば、次のようになります。
/dev/null
- ファイルに書き込んだ内容はすべて無視してください。/dev/random
- ファイル内容の代わりにランダムデータ出力/dev/tcp
- このファイルに書き込んだすべてのデータをネットワーク経由で送信します。
まず、このタイプの「ファイル」の名前は何であり、実際には一種のスクリプトまたは変装されたバイナリですか?
第二に、どのように作られますか?これらのファイルはカーネルレベルでシステムに組み込まれていますか?それとも直接「魔法ファイル」を生成する方法はありますか(それはどうですか/dev/rickroll
)?
ベストアンサー1
/dev/zero
「特殊ファイル」、特に「デバイスノード」の例です。通常、ディストリビューションのインストールプロセスで作成されますが、次のこともできます。完全必要に応じて自分で作成できます。
あなたls
が尋ねるならば/dev/zero
:
# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5 Nov 5 09:34 /dev/zero
先頭の「c」は、これが「文字デバイス」であることを示します。他のタイプは「ブロックデバイス」(ls
「b」として印刷される)である。概して、ハードディスクなどのランダムアクセスデバイスはブロックデバイスである傾向がありますが、テープドライブやサウンドカードなどのシーケンシャルデバイスは文字デバイスである傾向があります。
「1,5」部分は「主装置番号」と「副装置番号」である。
この情報を使用して、mknod
コマンドを使用して独自のデバイスノードを作成できます。
# mknod foobar c 1 5
これにより、現在のフォルダに次のfoobar
タスクを実行する新しいファイルが作成されます。正確に。/dev/zero
(もちろん、必要に応じて他の権限を設定できます。)この「ファイル」には、実際には上記の3つの項目(デバイスタイプ、プライマリデバイス番号、およびセカンダリデバイス番号)が含まれています。これを使用して、ls
他のデバイスのコードを見つけて再作成できます。退屈する場合は、rm
作成したデバイスノードを削除してください。
デフォルトでは、プライマリデバイス番号はLinuxカーネルにどのデバイスドライバと通信するかを示し、セカンダリデバイス番号はデバイスドライバにどのデバイスを使用しているかを示します。 (たとえば、SATAコントローラがありますが、複数のハードドライブが接続されている可能性があります。)
欲しいなら発明新しいことをするための新しいデバイス...まあ、Linuxカーネルのソースコードを編集し、独自のカスタムカーネルをコンパイルする必要があります。だからこんなことはしないでください! :-) しかし、すでに持っているファイルと重複するデバイスファイルを追加できます。 udev などの自動化システムは、デフォルトでデバイスイベントを監視し、mknod
自動的にユーザーを呼び出します。rm
これよりも魔法のようなことはありません。
まだあるその他特殊ファイル形式:
Linuxはディレクトリを特別な種類のファイルと見なします。 (通常、ディレクトリを直接開くことはできませんが、可能であれば、そのディレクトリには特別にフォーマットされたデータが含まれており、そのディレクトリ内のすべてのファイルが見つかる場所をカーネルに知らせる一般的なファイルであることがわかります。)
シンボリックリンクは特殊ファイルです。 (ただし、ハードリンクはそうではありません。)この
ln -s
コマンドを使用してシンボリックリンクを作成できます。 (マンページを探してください。)「名前付きパイプ」または「FIFO」(先入れ先出しキュー)というものもあります。を使用して作成できます
mkfifo
。 FIFOは、次の方法で開くことができる魔法のファイルです。二つ一度プログラミング - 一度読んで、一度書きます。これが起こると、通常のシェルパイプのように動作します。しかし、各プログラムを個別に起動できます。
何らかの方法で「特別」ではないファイルを「一般ファイル」と呼びます。 Unixのドキュメントでは、これについての言及を時々見ることができます。これが意味するところです。デバイスノードやシンボリックリンクなどのファイルではありません。魔法の属性を持たない普通の日常ファイルです。