访问/ proc

Rob*_*bin 3 linux kernel procfs

我当前正在开发一个需要大量系统和过程信息的应用程序,其中某些信息只能通过/ proc获得,并且我对访问结构有一些一般性问题。

该应用程序将在Linux(内核> = 2.6)上运行,而不是在任何其他Unix风格的OS上运行。它应该可以访问/ proc中的任何数据,由于规范尚不清楚,所以我现在不能说什么了,但是整个/ proc目录与应用程序有关。


首先:是否有一个很好的文档,涵盖了从内核版本到内核版本添加/删除的所有功能?我特别想知道的一件事是各个文件的格式。我可以认为这是理所当然的吗?它在内核版本之间变化吗?

连接基于内核的解析过程根本不是问题,只是我找不到关于版本之间变化的任何好的文档,这些文档可以帮助我预先捕获解析错误。


另外:是否存在可以通过内核选项激活/停用的功能的明确列表(当然/ proc-feature本身除外)?我正在寻找仅在内核中设置了适当选项的情况下存在的文件/目录的列表。

作为我正在考虑的示例,这是proc手册页(http://linux.die.net/man/5/proc)的链接,其中包含很多有用的信息,例如,某些选项包括最早的它们提供了内核版本,其中包括是否需要加载模块。但是,这并没有描述所有信息的输出格式,如果我想解析它,这是我所需要的(例如,如果它在所有内核版本中都是一致的,或者在某个时候已更改)。


我想知道的第二件事是,如果被查询的进程在被查询时死亡,将会发生什么。我的时间间隔是几点?例如,如果我要获取一列读取所有结构的进程列表,然后逐一解析它们,那么如果我的进程x在读取之前死了,会发生什么?即使我检查目录是否存在,也可以在以后的一个应用程序调用中消失。


最后但并非最不重要的一点:是否有没有安装proc的主要发行版?

据我了解,很多通用工具都基于/ proc接口,例如lsmodor free,所以我猜想我可以期望/ proc几乎总是存在。

Gil*_*il' 5

即使没有任何保证,这些/proc接口也非常稳定(与/sys接口不同)。几乎所有更改都是向后兼容的,至少在某些版本中已经存在。为了安全起见,您应该坚持记录在案的接口。如果文件存在,则可以在更高版本中扩展其格式,但通常以向后兼容的方式进行扩展,例如向表中添加列。最容易消失的部分是与硬件暂存器有关的部分,例如ACPI或SCSI,它们正在迁移到其中/sys(当两者同时存在时,过渡期很长)。

除硬件信息(例如,/proc/cpuinfo在不同体系结构上具有非常不同的字段)外,大多数信息与体系结构无关。

主要文档Documentation/filesystems/proc.txt位于内核源代码中。考虑proc(5)作为概述,并proc.txt作为细节。内核文档通常不完整,因此如果您有时需要诉诸源代码,请不要感到惊讶。

/proc如果内核公开了其数据公开的驱动程序,则默认情况下会激活的大多数可选部分。这些例外大多与很少需要从内核外部访问的硬件功能有关。如果您需要访问这些功能,则可能已经需要进一步研究了。浏览Kconfig内核源文件中的详细信息。

过程数据(或与可移动硬件有关或由可卸载模块提供的硬件数据)可能会在您的鼻子下消失。/proc只需read调用一个合理大小的缓冲区,即可自动读取下面的大多数文件;如果您read依次执行多个调用,则驱动程序应保证您获得格式正确的数据。无法保证读取单独文件之间的原子性。如果您正在阅读有关某个进程的信息,则该进程可以随时终止,并且原则上甚至可以在完成之前由具有相同PID的另一个进程替换。

正如它在的描述中所说的/proc,“每个人都应该在这里说Y”。所有台式机/服务器Linux系统和大多数嵌入式Linux系统必须具有/proc;需要很多东西,包括ps其他过程管理命令,许多文件系统和与设备相关的工具以及模块加载。唯一可以放弃的系统/proc是非常小的单用途嵌入式系统,它们支持单个硬件配置并运行一组固定的程序。您可以指望它在这里。