linux-访问/ proc
作者:互联网
我当前正在开发一个需要大量系统和过程信息的应用程序,其中某些信息只能通过/ proc获得,并且我对访问结构有一些一般性问题.
该应用程序将在Linux(内核> = 2.6)上运行,而不是在任何其他Unix风格的OS上运行.它应该可以访问/ proc中的任何数据,由于规范尚不清楚,所以我现在不能说什么了,但是整个/ proc目录与应用程序有关.
首先:是否有一个很好的文档,涵盖了从内核版本到内核版本添加/删除的所有功能?我特别想知道的一件事是各个文件的格式.我可以认为这是理所当然的吗?它在内核版本之间变化吗?
连接基于内核的解析过程根本不是问题,只是我找不到关于各个版本之间发生了什么变化的任何好的文档,这些文档可以帮助我事先捕获解析错误.
另外:是否存在可以通过内核选项激活/停用的功能的明确列表(当然/ proc-feature本身除外)?我正在寻找仅在内核中设置了适当选项的情况下存在的文件/目录的列表.
作为我正在考虑的示例,这是proc手册页(http://linux.die.net/man/5/proc)的链接,其中包含许多很好的信息,例如一些选项包括它们可用的最早的内核版本,一些选项是否需要加载模块.但是,这并没有描述所有信息的输出格式,这是我要解析的信息所需要的格式(例如,如果它在所有内核版本中都是一致的或在某个时候有所更改).
我想知道的第二件事是,如果被查询的进程在被查询时死亡,将会发生什么.我的时间间隔是几点?例如,如果我要获取一列读取所有结构的进程列表,然后逐一解析它们,那么如果我的进程x在读取之前死了,会发生什么?即使我检查目录是否存在,也可以在以后的一个应用程序调用中消失.
最后但并非最不重要的一点:是否有没有安装proc的主要发行版?
据我了解,很多通用工具都是基于/ proc接口的,例如lsmod或free,所以我猜想我可以期望/ proc几乎总是存在.
解决方法:
/ proc接口非常稳定(与/ sys接口不同),即使没有任何保证.几乎所有更改都是向后兼容的,至少在某些版本中已经存在.你应该
坚持记录在案的接口是安全的.如果文件存在,则可以在更高版本中扩展其格式,但通常以向后兼容的方式进行扩展,例如在表中添加列.最容易消失的部分是与硬件暂挂件有关的部分,例如ACPI或SCSI,它们正在迁移到/ sys(如果同时存在,则过渡期很长).
除硬件信息外,大多数信息都与体系结构无关(例如,/ proc / cpuinfo在不同体系结构上具有非常不同的字段).
内核源代码中的主要文档为Documentation/filesystems/proc.txt
.将proc(5)
作为概述,将proc.txt作为详细信息.内核文档通常不完整,因此如果您有时需要诉诸源代码,请不要感到惊讶.
如果内核公开其数据公开的驱动程序,则默认情况下将激活/ proc的大多数可选部分.这些例外大多与很少需要从内核外部访问的硬件功能有关.如果您需要访问这些功能,则可能已经需要进一步研究了.在内核源代码中浏览Kconfig文件以获取详细信息.
过程数据(或与可移动硬件有关或由可卸载模块提供的硬件数据)可能会在您的鼻子下消失. / proc下的大多数文件都可以通过原子大小的读取,通过一个具有适当大小的缓冲区的单个读取调用即可;如果您依次执行多个读取调用,则驱动程序应保证您获得格式正确的数据.无法保证读取单独文件之间的原子性.如果您正在阅读有关某个进程的信息,则该进程可以随时终止,并且原则上甚至可以在完成之前由具有相同PID的另一个进程替换.
正如在/ proc的描述中所说的,“每个人都应该在这里说Y”.所有台式机/服务器Linux系统和大多数嵌入式Linux系统都必须具有/ proc;需要很多东西,包括ps和其他进程管理命令,许多文件系统和与设备相关的工具以及模块加载.唯一可以免除/ proc的系统是非常小的单用途嵌入式系统,它们支持单个硬件配置并运行一组固定的程序.您可以指望它在这里.
标签:kernel,procfs,linux 来源: https://codeday.me/bug/20191102/1989671.html