cat /proc/cpuinfo
と書くとどうなりますか?それは、CPU情報をオンザフライで読み取り、呼び出すたびにそのテキストを生成するOSへの名前付きパイプ(または何か他のもの)ですか?
/proc
でファイルを読み取ると、カーネル内のコードが呼び出され、ファイルの内容として読み取るテキストが計算されます。コンテンツがオンザフライで生成されるという事実は、ほとんどすべてのファイルの時間が現在と報告され、サイズが0と報告される理由を説明します。ここでは、0は「わからない」と読む必要があります。通常のファイルシステムとは異なり、/proc
にマウントされているファイルシステムは procfs と呼ばれ、ディスクまたは他のストレージメディア(FAT、ext2、zfsなど)から、またはネットワーク経由でデータをロードしません。 (NFS、Sambaなど)、ユーザーコードを呼び出しません( Fuse とは異なります)。
Procfsは、ほとんどの非BSD uniceに存在します。プロセスに関する情報を報告する方法として、AT-TのBell Labs NIX 8th edition から始まりました(そしてps
は、しばしば/proc
を通じて読み取られる情報のプリティプリンターです)。ほとんどのprocfs実装には、/proc/123
というファイルまたはディレクトリがあり、PID 123のプロセスに関する情報を報告します。Linuxは、例の/proc/cpuinfo
を含む、システムの状態を報告する多くのエントリでprocファイルシステムを拡張します。
これまで、Linuxの/proc
は、ドライバーに関する情報を提供するさまざまなファイルを取得していましたが、この使用法は /sys
の代わりに廃止され、/proc
はゆっくりと進化しています。 /proc/bus
や/proc/fs/ext4
などのエントリは、下位互換性のために残されていますが、/sys
の下に同様の新しいインターフェイスが作成されます。この回答では、Linuxに焦点を当てます。
Linuxでの/proc
に関するドキュメントの最初と2番目のエントリポイントは次のとおりです。
proc(5)
manページ;/proc
ファイルシステムカーネルのドキュメント。3番目のエントリポイントは、ドキュメントがそれをカバーしていない場合、ソースを読み取るです。マシンにソースをダウンロードできますが、これは巨大なプログラムであり、Linuxの相互参照である [〜#〜] lxr [〜#〜] は非常に役立ちます。 (LXRには多くのバリアントがあります。lxr.linux.no
で実行されているものは最も優れていますが、残念ながらサイトはダウンしています。)Cについての少しの知識が必要ですが、不可解なものを追跡するためにプログラマーである必要はありません。値。
/proc
エントリのコア処理は fs/proc
ディレクトリにあります。ドライバーは、/proc
にエントリを登録できます(ただし、上記で示したように、/sys
のために廃止されました)。したがって、fs/proc
で探しているものが見つからない場合は、他の場所を探してください。ドライバは include/linux/proc_fs.h
で宣言された関数を呼び出します。カーネルバージョン 最大3.9 関数create_proc_entry
といくつかのラッパー(特にcreate_proc_read_entry
)を提供し、カーネルバージョン .10以降 代わりにproc_create
とproc_create_data
(およびいくつか)のみを提供します。
/proc/cpuinfo
を例にとると、"cpuinfo"
を検索すると、 fs/proc/cpuinfo.c
のproc_create("cpuinfo, …")
が呼び出されます。コードが定型コードであることがわかります。/proc
の下のほとんどのファイルはテキストデータをダンプするだけなので、それを行うためのヘルパー関数があります。 seq_operations
構造だけがあり、実際の肉は cpuinfo_op
データ構造にあります。これはアーキテクチャに依存し、通常Arch/<architecture>/kernel/setup.c
(または場合によっては別のファイル)で定義されます。 x86を例にとると、 Arch/x86/kernel/cpu/proc.c
が表示されます。そこでの主な関数はshow_cpuinfo
で、これは必要なファイルの内容を出力します。インフラストラクチャの残りの部分は、要求した速度でデータを読み取りプロセスに送るためのものです。カーネル内のさまざまな変数のデータから、オンザフライで組み立てられているデータを確認できます。これには、 CPU周波数 などのオンザフライで計算されたいくつかの数値が含まれます。
/proc
の大部分は、/proc/<PID>
のプロセスごとの情報です。これらのエントリは fs/proc/base.c
array ;の tgid_base_stuff
に登録されます。ここに登録されている一部の関数は、他のファイルで定義されています。これらのエントリが生成される方法のいくつかの例を見てみましょう。
cmdline
は、同じファイルで proc_pid_cmdline
によって生成されます。プロセス内のデータを見つけて出力します。clear_refs
は書き込み可能ですが読み取り可能ではありません。したがって、 proc_clear_refs_operations
構造体は clear_refs_write
関数を定義しますが、読み取り関数は定義しません。cwd
は proc_cwd_link
で宣言されたシンボリックリンク(少し不思議なリンク)です。これは プロセスの現在のディレクトリを検索 し、リンクのコンテンツとして返します。fd
はサブディレクトリです。ディレクトリ自体の操作は proc_fd_operations
データ構造で定義されています(エントリを列挙する関数を除く定型文です proc_readfd
、プロセスの開いているファイルを列挙します)エントリの操作は `proc_fd_inode_operations です。/proc
のもう1つの重要な領域は/proc/sys
であり、これは sysctl
への直接インターフェイスです。この階層のエントリから読み取ると、対応するsysctl値の値が返され、書き込むと、sysctl値が設定されます。 sysctlのエントリポイントは fs/proc/proc_sysctl.c
にあります。 Sysctlには、独自の登録システム register_sysctl
と友達がいます。
@slmの答えは非常に包括的ですが、より簡単な説明は視点の変化から来ると思います。
日常の使用では、ファイルを物理的なものとして考えることができます。一部のデバイスに保存されているデータのチャンク。これは/ proc/cpuinfoのようなファイルを非常に不可解で混乱させます。ただし、ファイルをインターフェース;と考えると、完全に意味があります。一部のプログラムとの間でデータを送受信する方法。
この方法でデータを送受信するプログラムは、ファイルシステムまたはドライバーです(これらの用語の定義方法によっては、定義が広すぎるか狭すぎる可能性があります)。重要な点は、これらのプログラムのsomeがハードウェアデバイスを使用して、このインターフェイスを介して送信されたデータを格納および取得することです。すべてではありません。
ストレージシステムを使用しない(少なくとも直接)ファイルシステムの例は次のとおりです。
Plan9 OS( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs )は、一般的なプログラミングインターフェイスとしてファイルを使用する極端な例です。