本篇文章分析 Apollo 中监控模块中监控进程状态的相关代码。
ProcessMonitor 是一个普通的定时器组件,内部函数也只是常规的 RunOnce 和 UpdateStatus,所以,可以推断出它的逻辑非常简单。
但要注意的是它引入的头文件有 hmi_mode 和 system_status 两个,这说明它要从中获取一些数据结构定义。
上面的代码说明,ProcessMonitor 中的 RunOnce 每隔 1.5s 被触发一次。
工作流程分为 4 个步骤:
这里通过读取 /proc/pid/cmdline 信息
linux 把进程相关的信息映射到虚拟文件系统 /proc 目录下。而/proc/pid/cmdline是一个只读文件,里面存储了相应的进程启动命令行参数。
由于在 cmdline 文件下的命令行信息分割符是 ‘\0’,所以,需要把它们替换成空格。
首先,要弄明白两个东西:hmi mode 和 hmi module。 这在前面提到过的头文件中有定义。
HMIMode 里面包含了 Modules,是对应的一个 map。 Module 里面通过 ProcessMonitorConfig 指示模块是否正在运行。
ProcessMonitorConfig 只是一个 string 类数组,里面存放了进程启动时的命令行参数。
做 HMI Module 检测时,需要传入模块名字和刚获取到的正在运行的进程列表信息,通过 UpdateStatus 函数进行处理。
代码很简单,拿 running_processes 中的文本和传入的模块名字匹配,匹配上了就是 OK 的状态结果,否则就是 FATAL 的结果。
逻辑和 hmi module 的一样,只是对象是 monitor components。
仍然是通过 ProcessMonitorConfig 判断。
注释里面也有讲到,状态更新时会影响 SystemStatus.components[i].process_status的值。
一个 Component 的状态由 1 个概要状态和 5 个子状态组成。
process_status 是其中的 1 个子状态。
所以,现在回看代码,无非也是在 running_processess 列表中找 component 相应的 process_status 信息。
这个逻辑没有什么差别。