当我打开并读取 /proc 时会发生什么?

当我打开并读取 /proc 时会发生什么?

是否需要访问硬盘或者一切都在内存中完成?基本上我想不断从 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 文件路径时,就会调用相应的读取和写入函数。

相关内容