按文档读取不断变化的进程 procfs 视图
Linux procfs 通过文件系统接口暴露进程和内核信息。许多入口在读取时生成内容,而不是保存普通磁盘文件字节;每个入口都有具体含义、权限模型和格式。连续读取多个入口,不会冻结进程,也不会得到事务一致快照。因此,有用的观察必须对应正确进程实例和正确解释,不能因为内容都来自 proc,就假定它们是同一时刻的完整状态。 成功读取链接文本,不保证能够通过链接打开对象。Linux 还会单独检查被引用 inode 的权限。反过来,只读取描述符链接文字也不等于消费了持有者的数据。应分清查看元数据、打开引用对象以及读取对象内容,尤其是管道等带状态的数据流,不能把本例普通文件的结果泛化到所有描述符。 每个 procfs 入口都是有文档定义且受权限检查的视图。读取时刻、进程身份、专用解析方式和对象寿命,共同决定观察能够证明什么。 坏掉的样子 普通文件假设可能立刻失效。proc 条目报告大小为零,却仍然返回有用内容;逐进程目录可能随着进程退出消失,数字 PID 之后也可能指向另一个实例。读取失败不一定表示系统安装损坏,某个编号也不会永久代表同一工作负载。生命周期变化本来就是观测需要处理的条件,应避免把正常退出当成异常环境。 不同入口需要按各自格式解析。status 包含有标签字段,stat 则使用固定字段顺序,其中括号包住的命令名可以包含空格和右括号。直接把整行按空白拆分,会让预期字段错位。cmdline 与 environ 使用空字符分隔,普通按行或空格切分,会破坏参数和值的边界。解析方式必须来自接口文档,而不是文件看起来像文本这一点。 视图本身也有语义边界。environ 描述程序执行时建立的环境区域,不保证是所有后续环境修改的实时字典;命令行内容也可以被进程修改。描述符链接以 deleted 结尾,不表示打开对象已经消失。这些入口提供具体状态证据,却不是可以互相替代的身份凭据或访问保证,需要先明确每项观察到底回答什么问题。 ...