是否需要访问硬盘或者一切都在内存中完成?基本上我想不断从 meminfo 和 cpuinfo 获取更新的值。
我是否需要重新打开文件,然后重新读取以获得更新的值,或者我可以重新读取吗?我目前无法访问 Linux 安装。
答案1
当您读取时/proc
,内核会动态生成内容。不涉及硬盘。
您正在做的事情与许多监控程序所做的事情类似,所以我建议您看看他们在做什么。例如,您可以查看 top 的作用:
strace top >/dev/null
跟踪显示 top 打开/proc/uptime
、/proc/loadavg
、/proc/stat
并且/proc/meminfo
一劳永逸。对于除 之外的所有这些文件/proc/uptime
,top 都会返回到(虚拟)文件的开头,并在每次刷新显示时再次读取。
大多数数据/proc/cpuinfo
是恒定的,但一些字段(例如某些机器上的 CPU 速度)是动态更新的。
proc 文件系统记录在内核文档中,位于Documentation/filesystems/proc.txt
。如果您对某些深奥的细节感到绝望,您可以浏览源码。
答案2
/proc 文件系统是所谓的“伪文件系统”,这意味着(afaiu)没有磁盘使用。
我不太确定这在最低级别是如何工作的,所以我可能是错的,但这里是。如果我跑
f = open('/proc/meminfo')
f.read()
f.seek(0)
f.read()
我得到两个不同的输出。 Afaik,seek(0) 仅重置读取偏移量,并且不会重新打开文件。这表明重新读取文件足以获取新值。
也就是说,如果您正在为 Linux 进行开发,那么永久访问 Linux 盒子似乎是一件非常合乎逻辑的事情……
答案3
这些文件不存储在磁盘上,但它们是内核的挂钩。
当您打开文件(使用fopen()
)时,内核会处理这项工作。它遍历挂载点,找到合适的驱动程序来处理请求,并将任务交给该驱动程序。
在 的情况下/proc
,文件读取请求被传递到内核中的内部“proc”系统。当您读取文件时,它会从内存中返回值。
类似的模式也发生在/dev
.内核看到您打开具有特定设备 ID 的开发节点,并将 IO 流与处理请求的特定驱动程序关联起来。
基本上我想不断从 meminfo 和 cpuinfo 获取更新的值。
您可以读取 proc 文件系统来读取这些值,或者查看是否有其他可以使用的系统调用。然而,这将是一种轮询机制,因此总是涉及一定的系统负载。
答案4
该/proc
文件系统是一个伪文件系统。这是一种将内存从用户空间转移到内核空间的便捷方法,反之亦然。
目录中的每个条目(文件或目录)/proc
都是由内核的一部分创建的。每个条目都可以读取和/或写入。它们可以像任何普通文件一样从用户空间打开。条目的创建方式大致如下(在内核模块内):
procentry1 = create_proc_entry(path);
procentry1->read = read_function1;
procentry->write = write_function1;
因此,您粗略地指定要创建的路径以及要在读/写时调用的函数(您需要其中之一或两者)。读取函数返回一个字符串(类似于文件读取调用),而写入函数则接受一个字符串。每当程序尝试读取/写入相应的 proc 文件路径时,就会调用相应的读取和写入函数。