从下面的消息,我们知道有在文件/ 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
这些都不是真正的磁盘上的文件(你提到),但他们也不是内存中的文件 - 在/ proc名称对应的呼叫到在操作系统运行内核,并且内容是在飞行中产生的。
该系统不知道该文件将有多大,而不会产生他们,但是如果你看过“文件”两次并不能保证你得到同样的数据,因为系统可能发生了变化。
你可能会寻找节目的sysctl -a代替。
在/ proc事情是不是真的文件。 在大多数情况下,他们不是在内存中,甚至文件。 当你访问这些文件,proc文件系统驱动程序执行一个系统调用中获取数据适用于该文件,然后将其格式化输出。 这通常是对动态构建动态数据。 这样的一个例子是的/ proc /净/ ARP,其包含当前ARP缓存。
获得这些东西的大小只能通过格式化整个输出来完成,所以列出文件时,它不只是做。 如果你想要的大小,使用wc -c
像你一样。
在/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
他们。
这不是真的在存储器中的文件,这是用户和内核之间的接口。