wcとstatが/proc/[pid]/cmdlineに対して異なる結果を生成するのはなぜですか?

wcとstatが/proc/[pid]/cmdlineに対して異なる結果を生成するのはなぜですか?

wc原因を把握してstatいろいろな情報提供をしようとします/proc/[pid]/cmdline

wc私のシェルcmdlineファイルサイズが6バイトであるとしましょう。

$ wc --bytes /proc/$$/cmdline
6 /proc/10425/cmdline

statファイルサイズが0バイトであることを示します。

$ stat --format='%s' /proc/$$/cmdline
0

file同意するstat

$ file /proc/$$/cmdline
/proc/10425/cmdline: empty

cat次の出力を提供します。

$ cat -vE /proc/$$/cmdline
-bash^@

これは他の* nixオペレーティングシステムではなくLinux上で行われます。

statプログラムにwcファイルのバイト数を計算する他のアルゴリズムはありますか?

答え1

以下のファイルは通常の/procファイルではなく、カーネルによって動的に生成された仮想ファイルです。ほとんどの場合(すべて?)システムはサイズを事前に計算しませんが、それを読み取るプログラムは目的のデータを取得します。

wcあなたがしたことと、例えば何をするのかというstat違いは、lsここwcでファイルを開いて読んで何を得るかを計算し、システムコールを使用してstatサイズを含むファイルのメタデータを要求することです(たとえば、すべてをインポートすることもできます)。 。所有者と権限)。仮想ファイルについても同じ結果は得られません。lsstat()

egを実行すると、ls -l /proc/$$/ほとんどのファイルからデータを読み取ることができますが、サイズが0のファイルがたくさん表示されます。

デバイスノード/dev/sdaは似ていますが、その場合はlsサイズさえ表示されず、デバイス番号のみが表示されます。

特にfilefile -sデータのみ読み込み特殊ファイルかどうかは気にしないように要求できます。

答え2

はい、wcとstatにはファイルのバイト計算のための異なるアルゴリズムがあります。

トイレファイルのバイト数を計算します(この場合は6)。

統計資料サイズ(バイト)を含むファイルに関する情報を表示します。ただし、/proc/[pid]/cmdline はファイルシステムの一般的なファイルではなく、proc ファイルシステムの仮想ファイルです。このファイルには、指定されたプロセスIDでプロセスを開始するために使用されるコマンドラインパラメーターが含まれています。ファイルシステムではなくメモリに格納されるため、サイズが作成された実際のバイト数と異なる場合があります。これがstatがサイズを0として報告する理由です。

fileコマンドは、内容に基づいてファイルの種類を決定するために使用され、/ proc / [pid] / cmdlineを「空の」ファイルとして正しく識別します。

結論として、トイレファイルの実際のバイト数を計算します。統計資料ファイルに関する情報を表示し、文書内容に基づいてファイルの種類を決定します。

関連情報