我该怎么让文件在/ proc的大小? 它不应该是零号(how can i show the si

2019-06-17 23:56发布

从下面的消息,我们知道有在文件/ proc / SYS /网/的IPv4 / IP_FORWARD两个字符,但为什么LS只是表明这个文件大小为0?

我知道这是不是磁盘上的文件,但在存储器中的文件,所以是有,我可以看到在/ 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 

Answer 1:

这些都不是真正的磁盘上的文件(你提到),但他们也不是内存中的文件 - 在/ proc名称对应的呼叫到在操作系统运行内核,并且内容是在飞行中产生的。

该系统不知道该文件将有多大,而不会产生他们,但是如果你看过“文件”两次并不能保证你得到同样的数据,因为系统可能发生了变化。

你可能会寻找节目的sysctl -a代替。



Answer 2:

在/ proc事情是不是真的文件。 在大多数情况下,他们不是在内存中,甚至文件。 当你访问这些文件,proc文件系统驱动程序执行一个系统调用中获取数据适用于该文件,然后将其格式化输出。 这通常是对动态构建动态数据。 这样的一个例子是的/ proc /净/ ARP,其包含当前ARP缓存。

获得这些东西的大小只能通过格式化整个输出来完成,所以列出文件时,它不只是做。 如果你想要的大小,使用wc -c像你一样。



Answer 3:

/proc/文件系统是一个“幻觉”由内核维护,不打扰给予的(大部分)的伪文件(大小,因为计算的是“真实”的大小,都包含具有内置整个文本伪文件的内容),并预计从最[伪]文本文件/proc/被按顺序从第一次读到最后一个字节(即直到EOF),在合理的大小(例如1K)块。 见PROC(5)了解详细信息手册页。

因此,有没有办法让真正的大小(像一些文件/proc/self/maps/proc/sys/net/ipv4/ip_forward在一个单一的系统调用(像) 统计(2) ,因为这会给出一个大小的0,所报告的统计(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他们。



Answer 4:

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



文章来源: how can i show the size of files in /proc? it should not be size zero