我如何显示 /proc 中文件的大小?它的大小不应该为零
- 2024-10-10 08:38:00
- admin 原创
- 79
问题描述:
从下面的消息中,我们知道文件 /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
解决方案 1:
这些实际上并不是磁盘上的文件(正如您所提到的),但它们也不是内存中的文件 - /proc 中的名称对应于操作系统中正在运行的内核的调用,并且内容是动态生成的。
如果不生成文件,系统就不知道文件有多大,但是如果您读取“文件”两次,则不能保证您获得相同的数据,因为系统可能已经发生了变化。
您可能正在寻找程序
sysctl -a
。
解决方案 2:
/proc 中的内容实际上并不是文件。在大多数情况下,它们甚至不是内存中的文件。当您访问这些文件时,proc 文件系统驱动程序会执行系统调用,获取适合文件的数据,然后将其格式化以供输出。这通常是动态构建的数据。一个例子是 /proc/net/arp,它包含当前的 ARP 缓存。
只有格式化整个输出才能获取这些内容的大小,因此仅在列出文件时才可以获取。如果您想要大小,请wc -c
像以前一样使用。
解决方案 3:
文件系统/proc/
是内核维护的“假象”,它不费心给出(大多数)伪文件的大小(因为计算“实际”大小通常需要构建整个文本伪文件的内容),并且期望大多数 [伪] 文本文件按/proc/
顺序从第一个字节到最后一个字节(即直到 EOF)读取,块大小合理(例如 1K)。有关详细信息,请参阅proc(5)手册页。
因此,无法通过单个系统调用(例如stat(2) )/proc/self/maps
获取(某些文件(例如或))的真实大小,因为它会给出stat(1)或ls(1)命令报告的大小为 0。读取这些文本文件的典型方法可能是/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
字节。
解决方案 4:
它实际上并不是内存中的文件,而是用户和内核之间的接口。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件