[C++] / proc /ファイルを解析するのは安全ですか?


Answers

/procファイルはuserspaceの通常ファイルとして表示されますが、実際のファイルではなく、userspace( openreadclose )からの標準ファイル操作をサポートするエンティティです。 これは、カーネルによって変更されている通常のファイルをディスク上に置くこととは全く異なることに注意してください。

すべてのカーネルは、 sprintfような関数を使って内部状態を自身のメモリに出力し、 read(2)システムコールを発行するたびにそのメモリをユーザスペースにコピーします。

カーネルは通常のファイルとはまったく異なる方法でこれらの呼び出しを処理します。これは、読み込んだデータのスナップショット全体がopen(2)ときに準備ができていることを意味しますopen(2)カーネルは、一貫性と原子性。 私はどこでもそれを読んだことはありませんが、そうでなければ理にかなっていません。

私のアドバイスは、あなたの特定のUnixフレーバーでprocファイルの実装を見てみることです。 これは実際には、標準によって管理されていない実装上の問題(出力の形式と内容)です。

最も単純な例は、Linuxのuptime procファイルの実装です。 single_open提供されるコールバック関数で、バッファ全体がどのように生成されるかに注意してください。

Question

私は/proc/net/tcp/を解析したいのですが、それは安全ですか?

/proc/からファイルを開いて読み込み、恐れずに、他のプロセス(またはOS自体)が同じ時間にそれを変更するようにするにはどうすればよいですか?




Linuxカーネルのprocfs APIは、読み取りが一貫性のあるデータを返すようにするインターフェイスを提供します。 __proc_file_readのコメントを読んで__proc_file_read 。 大きなコメントブロックの項目1)は、このインターフェースを説明しています。

もちろん、このインタフェースを正しく使用して、返されるデータが一貫していることを確認するためには、特定のprocファイルの実装が必要です。 あなたの質問に答えてください:いいえ、カーネルは読み込み中のprocファイルの一貫性を保証しませんが、それらのファイルの実装が一貫性を提供する手段を提供します。




未知のバグを/procて、 /proc競合状態がなく、壊れたデータや古いデータと新しいデータが混在する可能性があります。 この意味で、それは安全です。 しかし、 /procから読み込んだデータの大部分は、生成されるとすぐに潜在的に時代遅れであり、読んだり処理するまでにはなおさら厳しい競合状態が残っています。 たとえば、プロセスはいつでも終了する可能性があり、新しいプロセスに同じPIDを割り当てることができます。 競争条件なしで使用できる唯一のプロセスIDは、自分の子プロセスです。 ネットワーク情報(オープンポートなど)にも同じですが、実際には/proc情報の大部分が入ります。 自分自身のプロセスや潜在的に子プロセスに関するデータを除いて、 /procデータが正確であることに頼るのは悪くて危険な習慣と考えています。 もちろん、 /procからの他の情報をユーザ/管理者に情報/ロギングなどのために提示することは、依然として有用かもしれません。 目的。