cat /proc/cpuinfo
と書くとどうなりますか 。これは、CPU情報をその場で読み取り、呼び出すたびにそのテキストを生成するOSへの名前付きパイプ(または他の何か)ですか?
承認された回答:
/proc
の下のファイルを読み取るときはいつでも 、これは、ファイルコンテンツとして読み取るテキストを計算するカーネル内のコードを呼び出します。コンテンツがオンザフライで生成されるという事実は、ほとんどすべてのファイルの時間が現在と報告され、サイズが0と報告される理由を説明しています。ここでは、0を「わからない」と読む必要があります。通常のファイルシステムとは異なり、/proc
にマウントされているファイルシステム はprocfsと呼ばれ、ディスクやその他のストレージメディア(FAT、ext2、zfsなど)またはネットワーク経由(NFS、Sambaなど)からデータをロードせず、ユーザーコードを呼び出しません(FUSEとは異なります)。 。
Procfsはほとんどの非BSDユニスに存在します。プロセス(およびps
)に関する情報を報告する方法として、UNIX第8版のAT&Tのベル研究所で誕生しました。 多くの場合、/proc
を介して読み取られる情報のきれいなプリンタです。 )。ほとんどのprocfs実装には、/proc/123
というファイルまたはディレクトリがあります。 Linuxは、例の/proc/cpuinfo
を含む、システムの状態を報告するさらに多くのエントリでprocファイルシステムを拡張します。 。
過去には、Linuxの/proc
ドライバーに関する情報を提供するさまざまなファイルを取得しましたが、/sys
を優先して、この使用は廃止されました。 、および/proc
今はゆっくりと進化します。 /proc/bus
のようなエントリ および/proc/fs/ext4
下位互換性のためにそのままにしておきますが、/sys
の下に新しい同様のインターフェイスが作成されます。 。この回答では、Linuxに焦点を当てます。
/proc
に関するドキュメントの最初と2番目のエントリポイント Linuxの場合:
-
proc(5)
マニュアルページ; -
/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
)、およびカーネルバージョン3.10以降では、代わりにproc_create
のみが提供されます。 およびproc_create_data
(およびその他いくつか)
/proc/cpuinfo
を取得する 例として、"cpuinfo"
の検索 proc_create("cpuinfo, …")
の呼び出しに移動します fs/proc/cpuinfo.c
内 。 /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
に登録されています 、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
を使用した独自の登録システムがあります。 と友達。