我怎么能显示/ proc文件的大小? 它不应该是大小零

从以下消息中我们知道file / 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 

Solutions Collecting From Web of "我怎么能显示/ proc文件的大小? 它不应该是大小零"

这些并不是真正的磁盘文件(正如你所提到的那样),但是它们也不是内存中的文件 – / proc中的名字与操作系统中正在运行的内核的调用相对应,并且内容在运行中生成。

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

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

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

获取这些东西的大小只能通过格式化整个输出来完成,所以在列出文件的时候并没有完成。 如果你想要的尺寸,像你一样使用wc -c

/proc/ filesystem是由内核维护的“错觉”,它不会给予其大部分伪文件的大小(因为计算“真实”大小通常涉及构建整个文本伪文件内容),并期望从/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, // eg /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); } 

这不是真的在内存中的文件,它是用户和内核之间的接口。