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
サイズを含むファイルのメタデータを要求することです(たとえば、すべてをインポートすることもできます)。 。所有者と権限)。仮想ファイルについても同じ結果は得られません。ls
stat()
egを実行すると、ls -l /proc/$$/
ほとんどのファイルからデータを読み取ることができますが、サイズが0のファイルがたくさん表示されます。
デバイスノード/dev/sda
は似ていますが、その場合はls
サイズさえ表示されず、デバイス番号のみが表示されます。
特にfile
、file -s
データのみ読み込み特殊ファイルかどうかは気にしないように要求できます。
答え2
はい、wcとstatにはファイルのバイト計算のための異なるアルゴリズムがあります。
トイレファイルのバイト数を計算します(この場合は6)。
統計資料サイズ(バイト)を含むファイルに関する情報を表示します。ただし、/proc/[pid]/cmdline はファイルシステムの一般的なファイルではなく、proc ファイルシステムの仮想ファイルです。このファイルには、指定されたプロセスIDでプロセスを開始するために使用されるコマンドラインパラメーターが含まれています。ファイルシステムではなくメモリに格納されるため、サイズが作成された実際のバイト数と異なる場合があります。これがstatがサイズを0として報告する理由です。
fileコマンドは、内容に基づいてファイルの種類を決定するために使用され、/ proc / [pid] / cmdlineを「空の」ファイルとして正しく識別します。
結論として、トイレファイルの実際のバイト数を計算します。統計資料ファイルに関する情報を表示し、文書内容に基づいてファイルの種類を決定します。