linux - sh file size check




/ procにファイルのサイズをどのように表示できますか? サイズゼロであってはなりません (3)

次のメッセージから、/ proc / sys / net / ipv4 / ip_forwardファイルには2つの文字があることがわかりましたが、なぜこのファイルのサイズがゼロであることがわかりましたか?

私はこれがディスク上のファイルではなく、メモリ内のファイルであることを知っているので、/ procのファイルの実際のサイズを見ることができるコマンドはありますか?

[email protected]:/proc/sys/net/ipv4# cat ip_forward | wc -c
2
[email protected]:/proc/sys/net/ipv4# ls -l ip_forward
-rw-r--r--    1 root     root            0 Sep  3 00:20 ip_forward
[email protected]:/proc/sys/net/ipv4# pwd
/proc/sys/net/ipv4 

/ proc内のものは実際にはファイルではありません。 ほとんどの場合、それらはメモリ内のファイルではありません。 これらのファイルにアクセスすると、procファイルシステムドライバは、ファイルに適切なデータを取得して出力用にフォーマットするシステムコールを実行します。 これは通常、オンザフライで構築された動的データです。 この例は/ proc / net / arpで、現在のARPキャッシュを含んでいます。

これらのことの大きさを知ることは、出力全体をフォーマットすることによってのみ行うことができます。そのため、ファイルをリストするときだけではありません。 サイズが必要な場合は、 wc -cを使ってください。


これは実際にメモリ内のファイルではなく、ユーザとカーネルの間のインタフェースです。


/proc/ファイルシステムは、カーネルによって維持される「錯覚」であり、擬似ファイルのサイズを与えることを嫌うものではありません(実際のサイズの計算には通常、テキスト疑似ファイルの全体内容)を含み、 /proc/からのほとんどの[pseudo]テキストファイルが最初のバイトから最後のバイト(すなわちEOFまで)、合理的なサイズ(例えば1K)のブロックで順に読み込まれることを期待しています。 詳細は、 proc(5)のマニュアルページを参照してください。

だから、単一のシステムコール( stat(2)のような)で本当のサイズ( /proc/self/maps/proc/sys/net/ipv4/ip_forwardようなファイル)を得る方法はありません。 stat (1)コマンドまたはls(1)コマンドによって報告される0の値)。 これらのテキストファイルを読む典型的な方法は、

FILE* f = fopen("/proc/self/maps", "r"); 
                // or some other textual /proc file, 
                // e.g. /proc/sys/net/ipv4/ip_forward
if (f) 
  {
      do {
        // you could use readline instead of fgets
        char line[256];
        memset (line, 0, sizeof(line));
        if (NULL == fgets(line, sizeof(line), f))
          break;
        // do something with line, for example:
        fputs(line, stdout);
      } while (!feof (f));
    fclose (f);
  }




proc