6

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

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

root@OpenWrt:/proc/sys/net/ipv4# cat ip_forward | wc -c
2
root@OpenWrt:/proc/sys/net/ipv4# ls -l ip_forward
-rw-r--r--    1 root     root            0 Sep  3 00:20 ip_forward
root@OpenWrt:/proc/sys/net/ipv4# pwd
/proc/sys/net/ipv4 
4

4 に答える 4

5

これらは実際にはディスク上のファイルではありませんが (ご指摘のとおり)、メモリ内のファイルでもありません。 /proc 内の名前は、オペレーティング システムで実行中のカーネルへの呼び出しに対応し、コンテンツはオンザフライで生成されます。

システムは、ファイルを生成しない限りファイルの大きさを知りませんが、「ファイル」を 2 回読み取った場合、システムが変更されている可能性があるため、同じデータを取得できる保証はありません。

代わりに、プログラムsysctl -aを探しているかもしれません 。

于 2012-09-02T16:37:57.157 に答える
5

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

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

于 2012-09-02T16:38:30.840 に答える
2

ファイルシステムは、/proc/カーネルによって維持される「幻想」であり、疑似ファイル (ほとんど) のサイズをわざわざ与えることはありません (その「実際の」サイズを計算するには、通常、テキストの疑似ファイルのコンテンツ全体を構築する必要があるため)。また、ほとんどの [疑似] テキスト ファイルは/proc/、適切なサイズ (たとえば 1K) のブロックで、最初のバイトから最後のバイトまで (つまり、EOF まで) 順番に読み取られることを期待しています。詳細については、 proc(5)のマニュアル ページを参照してください。

したがって、単一の syscall ( stat (2)など)で(/proc/self/mapsまたはのようなファイルの) 真のサイズを取得する方法はありません。 )。これらのテキスト ファイルを読み取る一般的な方法は、次のようになります。/proc/sys/net/ipv4/ip_forward

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/self/cmdline) には、NULバイトが含まれている可能性があると記載されています。あなたはfreadそれらのためにいくつか必要になります.

于 2012-09-02T16:36:03.150 に答える
0

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

于 2012-09-02T16:34:00.183 に答える