3

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

该应用程序将在 Linux(内核 >= 2.6)上运行,而不是在任何其他 Unix 风格的操作系统上运行。它应该可以访问 /proc 中的任何数据,我不能说现在需要什么,因为规范还不清楚,但是整个 /proc 目录与应用程序相关。


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

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


另外:是否有可以通过内核选项激活/停用的功能的明确列表(当然 /proc-feature 本身除外)?I'm looking for a list of files / directories that only exist with the appropriate options being set in the kernel.

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


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


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

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

4

1 回答 1

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是非常小的单一用途嵌入式系统,它们支持单一硬件配置并运行一组固定的程序。你可以指望它在这里。

于 2012-02-03T16:15:29.313 回答