如何显示/proc目录下文件的大小?文件大小不能为零。

6

从下面的信息可以看出,文件/proc/sys/net/ipv4/ip_forward中有两个字符,但是为什么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个回答

6

这些并不是真正的磁盘文件(如您所提到的),但它们也不是内存中的文件 - /proc 中的名称对应于操作系统中运行内核的调用,并且内容是即时生成的。

系统不知道生成的文件有多大,但如果您两次读取“文件”,则不能保证获得相同的数据,因为系统可能已更改。

您可能正在寻找程序 sysctl -a


使用sysctl,我是否仍然需要在/proc中cat文件?还是我可以通过sysctl完成所有事情? - hugemeow

6

/proc中的内容并不是真正的文件。在大多数情况下,它们甚至不是内存中的文件。当您访问这些文件时,proc文件系统驱动程序执行一个系统调用,获取适合文件的数据,然后将其格式化为输出。这通常是即时构建的动态数据。其中一个例子是/proc/net/arp,其中包含当前的ARP缓存。

要获取这些内容的大小,只能通过格式化整个输出来完成,因此仅在列出文件时不会执行此操作。如果您想要大小,请像之前一样使用wc -c


3
/proc/ 文件系统是由内核维护的一种“幻觉”,它不会费心给出大多数伪文件的大小(因为计算“真实”大小通常需要构建整个文本伪文件的内容),并且希望从 /proc/ 读取导出文件时按照从第一个字节到最后一个字节(即 EOF)的顺序顺序读取,以合理大小的块(例如 1K)。有关详细信息,请参见 proc(5) 手册页面。
因此,没有办法通过单个系统调用(如 stat(2))获取某些文件(如 /proc/self/maps/proc/sys/net/ipv4/ip_forward)的真实大小,因为它将返回 0 的大小,如 stat(1)ls(1) 命令所报告。阅读这些文本文件的典型方式可能是:
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来读取它们。

0

它实际上不是在内存中的文件,而是用户和内核之间的接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接