![/procを開いて読むとどうなりますか? [コピー]](https://linux33.com/image/16202/%2Fproc%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6%E8%AA%AD%E3%82%80%E3%81%A8%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
ハードドライブにアクセスする必要がありますか、それともすべてがメモリで実行されますか?デフォルトでは、meminfoとcpuinfoから更新された値を引き続き取得したいと思います。
更新された値を取得するには、ファイルを再度開いて再読み込みする必要がありますか、それとも単に読み直すことができますか?現在、Linuxインストールにアクセスできません。
答え1
を読むと、/proc
カーネルはコンテンツを動的に生成します。ハードドライブは関係ありません。
あなたがやっていることは、多くの監視プログラムがやっていることに似ているので、彼らが何をしているのかを見てください。たとえば、top が実行する操作を確認できます。
strace top >/dev/null
トレースは、topがon、および/proc/uptime
set/proc/loadavg
になって消えたことを示します。 topを除くすべてのファイルについて(仮想)ファイルの先頭に戻り、ディスプレイが更新されるたびに再読み込みします。/proc/stat
/proc/meminfo
/proc/uptime
ほとんどのデータは/proc/cpuinfo
一定ですが、一部のフィールド(特定のシステムのCPU速度)は動的に更新されます。
proc ファイルシステムは、次のカーネル文書に文書化されています。Documentation/filesystems/proc.txt
。難解な詳細が絶望的な場合は、次のことができます。ソースコードの参照。
答え2
/ procファイルシステムはいわゆる「擬似ファイルシステム」で、これはディスクを使用しないことを意味します。
これが最低レベルでどのように機能するのかよくわからないので、間違っているかもしれませんが、ここにあります。走れば
f = open('/proc/meminfo')
f.read()
f.seek(0)
f.read()
2 つの異なる出力が表示されます。 Afaik,eek(0) は読み取りオフセットのみをリセットし、ファイルを再度開くことはありません。これは、ファイルを読み直すだけで新しい値を取得できることを示しています。
つまり、Linux用に開発する場合は、Linuxボックスに恒久的にアクセスすることが非常に論理的なようです。
答え3
これらのファイルはディスクには保存されませんが、カーネルへのフックです。
ファイルを開くと(使用fopen()
)、カーネルはこれを処理します。マウントポイントを参照して要求を処理する適切なドライバを見つけて、そのドライバにタスクを渡します。
の場合、/proc
ファイル読み取り要求はカーネルの内部 "proc"システムに転送されます。ファイルを読み込むと、メモリの値が返されます。
同様のパターンが発生します/dev
。カーネルは、特定のデバイスIDを使用して開発ノードを開くことを確認し、IOストリームを要求を処理する特定のドライバに関連付けます。
デフォルトでは、meminfoとcpuinfoから更新された値を引き続き取得したいと思います。
procファイルシステムを読み取ることで、これらの値を読み取るか使用できる他のシステムコールがあるかどうかを確認できます。ただし、これはポーリングメカニズムであるため、常にいくつかのシステム負荷が関係します。
答え4
この/proc
ファイルシステムは擬似ファイルシステムです。これは、ユーザー空間からカーネル空間へ、またはその逆にメモリを転送する便利な方法です。
ディレクトリ内の各エントリ(ファイルまたはディレクトリ)は/proc
カーネルの一部によって生成されます。各項目を読み書きできます。通常のファイルのようにユーザー空間で開くことができます。エントリはおおよそ次のように生成されます(カーネルモジュール内):
procentry1 = create_proc_entry(path);
procentry1->read = read_function1;
procentry->write = write_function1;
したがって、生成するパスと読み取り/書き込み時に呼び出す関数を大まかに指定します(1つまたは両方が必要です)。読み取り関数は文字列を返し(ファイル読み取り呼び出しに似ています)、書き込み関数は文字列を受け取ります。プログラムがそのprocファイルパスを読み書きしようとするたびに、その読み取りおよび書き込み関数が呼び出されます。